Perl - 机械化? - 如何使页面中的所有链接达到特定的“分隔符”文本

时间:2011-10-18 18:59:08

标签: perl mechanize

这些是我安装的模块。

use WWW::Mechanize;
use XML::Simple;
use LWP::Simple;
use Data::Dumper;
use Web::Scraper;
#use HTML::Grabber;

我正在尝试将所有以“.com”结尾的链接添加到html标记:“<div class="nogo_class">Proceed No More</div>”从结果中创建数组。

我已经看过我在这里和文档中找到的各种示例,但是没有做到这一点。 无论如何,我无论如何都无法包裹我的小脑。

因此,使用我安装的模块,如何将所有以“.com”结尾的链接到达该停止点:“<div class="nogo_class">Proceed No More</div>”到数组中?

所以,稍后我可以通过循环或其他任何方式获取链接。 例如$somearray[$counter];

我真的没经验,希望我能正确地提出这个问题。任何例子中的详细解释都将帮助我学习这一点。

谢谢你的帮助。

P.S。 “nogo_class”在页面中多次使用,但“Proceed No More”文本仅在页面中出现一次。另外,我正在运行Perl v5.8.8,而Grabber最低需要v5.10.0。

1 个答案:

答案 0 :(得分:3)

使用HTML::TokeParser::Simple解析文档。当您在a中找到“不再继续”的文字时,请停止解析div.nogo代码。

#!/usr/bin/env perl

use warnings; use strict;
use HTML::TokeParser::Simple;
use URI;

my $p = HTML::TokeParser::Simple->new(handle => \*DATA);

my @interesting_links;

while (my $tag = $p->get_tag(qw'a div')) {
    if ($tag->is_start_tag('div')) {
        my $class = $tag->get_attr('class');
        if (defined($class) and $class eq 'nogo_class') {
            my $text = $p->get_text('/div');
            last if defined($text) and $text eq 'Proceed No More';
        }
    }
    elsif ($tag->is_start_tag('a')) {
        my $href = $tag->get_attr('href');
        next unless defined $href;
        my $uri = URI->new($href);
        my $host = $uri->host;
        next unless $host =~ /[.]com\z/;
        push @interesting_links, $href;
    }
}

print "$_\n" for @interesting_links;

__DATA__
<!DOCTYPE HTML>
<html>
<head>
<title>Test</title>
</head>
<body>

<p><a href="http://example.com/link1">Link 1</a>, <a
href="http://example.org/link2">Link 2</a> and <a
href="http://example.com/link3">Link 3</a></p>

<div class="nogo_class">Keep going man!</div>

<p><a href="http://example.com/link4">Link 4</a>, <a
href="http://example.org/link5">Link 5</a> and <a
href="http://example.net/link6">Link
6</a></p>

<div class="nogo_class">Keep going man!</div>

<div class="nogo_class">Proceed No More</div>

<p><a href="#">Link 7</a>, <a href="#">Link 8</a> and <a href="#">Link
9</a></p>


</body>
</html>