-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の親は 、2 番目の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 を処理する前に、バリデーターまたは HTML::Tidy を介して HTML を渡す必要があります。

于 2011-01-31T11:36:47.983 に答える