首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >刮刀无法在<link>文档的<body>中找到<body>或<meta>元素

刮刀无法在<link>文档的<body>中找到<body>或<meta>元素
EN

Stack Overflow用户
提问于 2015-01-17 19:49:59
回答 1查看 269关注 0票数 2

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

我正试图从一个网页中抓取一些数据。下面是我试图提取的一些数据片段:

代码语言:javascript
复制
<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代码:

代码语言:javascript
复制
my $div = scraper {
  process 'span[itemprop="thumbnail"] > link', url => '@href';
};
my $res = $div->scrape( $html );
$url = $res->{url};

无论我如何尝试,$url都会返回未定义的内容。我使用的是网页::刮板模块的.36版本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-17 21:27:44

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

处理元素的方式基于HTML::Tagset中的散列,并且可以通过对这些数据进行黑客攻击来修复各种类型的元素。

如果将这个添加到程序的顶部

代码语言:javascript
复制
use HTML::Tagset;

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

然后,它“修正”了问题中的具体情况,但当然,适当的解决方案应该考虑到itemprop属性和标记。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28003591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档