Как именно работает "родительская" функция из 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, прежде чем обрабатывать его.