【问题标题】:Perl HTML::TreeBuilder incorrect parsingPerl HTML::TreeBuilder 解析不正确
【发布时间】:2015-03-18 08:40:18
【问题描述】:

我有以下代码,它使用HTML::TreeBuilder 来解析来自网站的 HTML。

 my $urlToSpider = "http://www.yelp.com/biz/selden-standard-detroit";
 my $html = get $urlToSpider;

 $tree = HTML::TreeBuilder->new;
 #print $html;
 $tree->parse($html);

 print $tree->as_HTML;

在上面的示例中,当我将print $tree->as_HTML 保存到文件时,HTML 结构与原始结构不同,尽管print $html 给出了正确的结构。

为什么模块解析不正确?

【问题讨论】:

  • 它如何/什么解析不正确? (您可能不希望我们解析和比较 400kb 的 html?)
  • 您不应期望往返转换匹配。你需要它是相同的吗?

标签: html perl dom


【解决方案1】:

你所说的不正确的解析只是不匹配的往返转换。 as_HTML 方法的结果极不可能与源数据匹配,因为它只是等同于原始 HTML。

会有差异因为但不限于这些原因

  • HTML 数据可以包含无关紧要的空白,这对浏览器中呈现的内容没有影响。 HTML::TreeBuilder 不存储该空格,也不会复制它

  • HTML::TreeBuilder 对原始 HTML 中的错误具有很高的容忍度,其行为与实际的 Web 浏览器相似。因此,任何不是严格有效的 HTML 都将被表示为对相同数据的有效解释

例如,如果我写

say HTML::TreeBuilder->new->parse('<p>text</p>')->as_HTML;

我得到了输出

<html><head></head><body><p>text</body></html>

所以模块已经识别出完整的文档应该包含&lt;html&gt;&lt;head&gt;&lt;body&gt;元素,这对于HTML数据的所有正常应用都很好。

【讨论】:

  • 还有一些非错误(如标签/属性名称大写以及可选的开始和结束标签)被规范化。
  • @Quentin:是的,有几个这样的等价物。如果您认为可以使其更有用,欢迎您编辑我的帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2013-02-25
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多