我已经盯着这个看了一个小时了,我要认输了。
我正试图从一个网页中抓取一些数据。下面是我试图提取的一些数据片段:
<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都会返回未定义的内容。我使用的是网页::刮板模块的.36版本。
发布于 2015-01-17 21:27:44
这是因为HTML::TreeBuilder::XPath中有一个bug。它对<link>和<meta>元素有一个天真的理解,坚持它们只属于<head>元素,即使它们有itemprop属性。
处理元素的方式基于HTML::Tagset中的散列,并且可以通过对这些数据进行黑客攻击来修复各种类型的元素。
如果将这个添加到程序的顶部
use HTML::Tagset;
for (qw/ link meta /) {
$HTML::Tagset::isHeadElement{$_} = 0;
$HTML::Tagset::isHeadOrBodyElement{$_} = 1;
}然后,它“修正”了问题中的具体情况,但当然,适当的解决方案应该考虑到itemprop属性和标记。
https://stackoverflow.com/questions/28003591
复制相似问题