我有以下代码,它使用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
给出了正确的结构。
为什么模块解析不正确?
答案 0 :(得分: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>
因此,该模块已认识到完整文档应包含<html>
,<head>
和<body>
元素,这对所有HTML数据的正常应用程序都适用。