-1

除非我遗漏了什么,否则CPAN上的文档并没有真正解释这种行为。我整理了一些快速测试代码来说明我的问题:

#!/usr/bin/perl
use warnings;
use strict;

use HTML::TreeBuilder;

my $testHtml = " 
<body>
        <h1>
                <p> 
                        <p>HELLO!
                        </p> 
                </p> 
        </h1>
</body>";

my $parsedPage = HTML::TreeBuilder->new;
$parsedPage->parse($testHtml);
$parsedPage->eof();

my @p = $parsedPage->look_down('_tag' => 'p');

foreach (@p) {print $_->parent->tag, " : ", $_->tag, "\t", $_->as_text, "\n";}

运行上述脚本后,输出为:

body : p

body : p        HELLO! 

看到所有标签一个接一个地嵌套,我认为第一个p标签h1的父级是 ,第二个p标签的父级是p. 为什么父函数显示body两者的标签?

4

1 回答 1

2

您的 HTML 无效。鉴于 HTML::TreeBuilder 是 HTML::Parser 的子类,我只能假设解析器正在尽其所能将您的文档转换为有效的 HTML。

你可以调用 $parsedPage->as_HTML 来查看解析器对你的 HTML 做了什么。它给了我这个:

<html><head></head><body><h1></h1><p><p>HELLO! </body></html>

也许您应该在处理之前通过验证器或 HTML::Tidy 传递您的 HTML。

于 2011-01-31T11:36:47.983 回答