我现在一直在盯着这一小时,我正在撒谎.
我试图从网页上抓取一些数据.这是我正在尝试提取的一些数据的片段:
<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>
Run Code Online (Sandbox Code Playgroud)
我想通过Web :: Scraper模块从标签中获取href属性的值.这是相关的perl代码:
my $div = scraper {
process 'span[itemprop="thumbnail"] > link', url => '@href';
};
my $res = $div->scrape( $html );
$url = $res->{url};
Run Code Online (Sandbox Code Playgroud)
无论我尝试什么,$ url都会返回undefined.我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
然后它"修复"你问题中的具体情况,但当然正确的解决方案应该考虑itemprop属性和标签.