Как именно работает «родитель» от 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
тег для обоих?
Решение
Ваш HTML недействителен. И учитывая, что HTML :: TreeBuilder является подклассом HTML :: Parser, я могу только предположить, что анализатор делает все возможное, чтобы преобразовать ваш документ в действительный HTML.
Вы можете позвонить в $ parsedpage-> as_html, чтобы увидеть, что анализатор сделал с вашим HTML. Это дает мне это:
<html><head></head><body><h1></h1><p><p>HELLO! </body></html>
Возможно, вам следует передать свой HTML через валидатор или html :: tidy, прежде чем обрабатывать его.