Как именно работает "родительская" функция из HTML::TreeBuilder?

Документация по 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 ответ

Решение

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

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

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

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

Другие вопросы по тегам