2011-01-31 122 views
-1

documentation on CPAN并没有真正解释这种行为,除非我失去了一些东西。我已经把一些快速的测试代码来说明我的问题:HTML :: TreeBuilder的“父”功能究竟如何工作?

#!/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标签?

回答

2

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

您可以调用$ parsedPage-> as_HTML来查看解析器对HTML所做的工作。它给了我这个:

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

也许你应该通过你的HTML通过验证或HTML :: TIDY,然后再处理它。

+0

嗯,这个示例只是我需要解析的一些HTML的重新创建。我不确定处理无效HTML的最佳方法是什么...... – s2cuts 2011-01-31 11:52:51

相关问题