2011-01-31 32 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