Web::Scraper 在 HTML 文档的 <body> 中找不到 <link> 或 <meta> 元素

Web::Scraper Cannot find <link> or <meta> elements in the <body> of an HTML document

我已经盯着这个看了一个小时了,现在我认输了。

我正在尝试从网页中抓取一些数据。这是我要提取的一些数据的片段:

<span itemprop="thumbnail" itemscope itemtype="http://schema.org/ImageObject">
  <link itemprop="url" href="http://blahblah.org/video/thumbnail_23432230.jpg">
  <meta itemprop="width" content="1280">
  <meta itemprop="height" content="720">
</span>

我想从 Web::Scraper 模块的标签中获取 href 属性 的值。这是相关的 perl 代码:

my $div = scraper {
  process 'span[itemprop="thumbnail"] > link', url => '@href';
};
my $res = $div->scrape( $html );
$url = $res->{url};

无论我怎样尝试,$url returns 未定义。我使用的是 Web::Scraper 模块的 .36 版。

这是因为 HTML::TreeBuilder::XPath 中的错误。它对 <link><meta> 元素有一种天真的理解,坚持认为它们只属于 <head> 元素,即使它们具有 itemprop 属性。

处理元素的方式基于 HTML::Tagset 中的哈希值,并且可以通过破解此数据来实现某种修复。

如果将它添加到程序的顶部

use HTML::Tagset;

for (qw/ link meta /) {
    $HTML::Tagset::isHeadElement{$_}       = 0;
    $HTML::Tagset::isHeadOrBodyElement{$_} = 1;
}

那么"fixes"你问题中的具体情况,当然,正确的解决方案应该考虑itemprop属性和标签。