Как именно работает «родительская» функция из HTML :: TreeBuilder? - PullRequest
0 голосов
/ 31 января 2011

Документация на 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 для обоих?

1 Ответ

2 голосов
/ 31 января 2011

Ваш HTML неверен. А учитывая, что HTML :: TreeBuilder является подклассом HTML :: Parser, я могу только предположить, что анализатор делает все возможное, чтобы преобразовать ваш документ в действительный HTML.

Вы можете вызвать $ parsedPage-> as_HTML, чтобы увидеть, что синтаксический анализатор сделал с вашим HTML. Это дает мне это:

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

Возможно, вы должны передать свой HTML через валидатор или HTML :: Tidy, прежде чем обрабатывать его.

...