2011-01-31 12 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であり、2番目の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> 

おそらく、あなたがそれを処理する前に、TidyのバリデータまたはHTML ::を通して、あなたのHTMLを渡す必要があります。

+0

hmmmというサンプルは、解析する必要があるHTMLの一部のレクレーションです。私は無効なHTMLを扱う最良の方法が何であるかわかりません... – s2cuts

+0

実際には、HTML :: Parserは、相互に内部で入れ子にすることができるタグを知りません。開始タグ、終了タグ、テキストなどを認識するのは、HTML :: Parserで生成されたイベントを受け取り、有効にネストされたツリーを構築するHTML :: TreeBuilderです。ほとんどのブラウザと同じように、無効なHTMLを処理しようとします。 – cjm

関連する問題