【问题标题】:Extracting Links in Perl using TreeBuilder使用 TreeBuilder 在 Perl 中提取链接
【发布时间】:2015-12-07 05:24:32
【问题描述】:

我正在编写一个脚本来将一堆信息提取到一个 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;
}

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

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

【问题讨论】:

    标签: perl mechanize www-mechanize html-content-extraction html-treebuilder


    【解决方案1】:

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

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

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

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

    您可以看到documentationthis doc 会告诉你可用的选项。

    【讨论】:

    • 如果你已经在使用 Mech,我认为这是一个非常合理的选择。
    • 谢谢!尽管这是我正在寻找的解决方案,但有人给了你 -1,所以我会投票赞成并将其标记为解决方案。
    • 这不会检查找到的a 元素是否在div 中,其中idinnercontent
    【解决方案2】:

    使用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/\.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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-07-29
      • 2012-01-23
      • 2020-09-26
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多