1

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

这是网站的粗略结构。在 innercontent 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;
}

我意识到后一种方法只是要在整个页面中搜索链接,但我将其包括在内以防万一该方法更有效,或者这两种方法可以结合使用。

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

4

2 回答 2

1

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

对于您的具体示例,您将获取 pdf 的链接:

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

然后对结果数组做任何你需要的事情。

您可以查看文档此文档将向您显示可用的选项。

于 2015-09-10T20:55:36.300 回答
0

使用HTML::TreeBuilder,您必须连续两次调用 tro look_down。第一个查找属性为 的div元素,第二个这些元素中搜索以查找其值以结尾的属性的元素idinnercontentahref.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/\.pdf\z/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 "$href\n" if $href =~ /\.pdf\z/i;
}
于 2015-09-11T00:23:14.880 回答