这些是我安装的模块。
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。
答案 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>