使用TreeBuilder在Perl中提取链接



我正在编写一个脚本,将一堆信息提取到一个HTML文件中。但是,我在从有问题的页面中提取特定的一组链接时遇到了一些困难。

这是网站的大致结构。在innercontentdiv和我下面展示的div之间还有一些其他的标题和段落。

<div id="innercontent">
<h1>Download here</h1>
<a href="website.pdf"><img src="stuff"></a>
</div>

现在在div ID "innercontent "中找到了多个链接,所以我正在寻找一种方法来匹配字符串或以其他方式只获得我想要的链接。请记住,我想要抓取的所有链接都是。pdf格式的,所以这可能会有所帮助。根据我所做的研究,我非常确信TreeBuilder可以处理这个问题。以下是我正在尝试的两种方法。我更愿意用第一个来解决。

# link to pdf of transcript
for ( $mech->look_down(_tag => 'a') ) {
  next unless $_->as_trimmed_text =~ m/pdf/;
  say $_->as_HTML;
}
my @links = $mech->links();
  for my $link ( @links ) {
  print $link->url;
}

我意识到后一种方法只是要搜索整个页面的链接,但我包含它只是为了防止这种方法更有效,或者如果这两种方法可以结合使用。

任何帮助或建议将不胜感激!

WWW::Mechanize能够根据相当多的属性提取链接,例如为链接显示的文本、实际链接或id。

对于您的特定示例,您将获取pdf格式的链接:

my @links = $mech->find_all_links(url_regex=>qr/.pdf$/)

,然后对结果数组执行任何需要的操作。

您可以查看文档。这个文档将向您展示可用的选项

使用HTML::TreeBuilder,您必须连续两次调用look_down。第一个是查找id属性为innercontentdiv元素,第二个是在这些元素中查找,查找具有href属性的a元素,其值以.pdf

结尾。

看起来是这样的

use strict;
use warnings;
use HTML::TreeBuilder;
my $html = <<END;
<div id="innercontent">
<h1>Download here</h1>
<a href="website.pdf"><img src="stuff"></a>
</div>
END
my $tree = HTML::TreeBuilder->new_from_content($html);
for my $div ( $tree->look_down(_tag => 'div', id => 'innercontent') ) {
    my @anchors = $div->look_down(_tag => 'a', href => qr/.pdfz/i );
    print $_->attr('href'), "n" for @anchors;
}

输出
website.pdf

我喜欢Mojo::DOM,因为它允许简单的CSS访问器,并允许非常简洁地解决问题

下面是使用该模块的解决方案。输出与上面的解决方案相同

use strict;
use warnings;
use Mojo::DOM;
my $html = <<END;
<div id="innercontent">
<h1>Download here</h1>
<a href="website.pdf"><img src="stuff"></a>
</div>
END
my $dom = Mojo::DOM->new($html);
for my $anchor ( $dom->find('div#innercontent a[href]')->each ) {
    my $href = $anchor->attr('href');
    print "$hrefn" if $href =~ /.pdfz/i;
}

相关内容

  • 没有找到相关文章

最新更新