Как именно работает «родитель» от HTML :: TreeBuilder работает?

StackOverflow https://stackoverflow.com/questions/4850264

Вопрос

А Документация на 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, прежде чем обрабатывать его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top