Pregunta

los Documentación en CPAN Realmente no explica este comportamiento a menos que me falta algo. He reunido un código de prueba rápido para ilustrar mi problema:

#!/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";}

Después de ejecutar el script anterior, la salida es:

body : p

body : p        HELLO! 

Ya que todas las etiquetas están anidadas una tras otra, creo que los padres del primero p la etiqueta sería h1, y el padre del segundo p la etiqueta sería p. ¿Por qué la función principal muestra el body etiqueta para ambos?

¿Fue útil?

Solución

Tu HTML no es válido. Y dado que HTML :: TreeBuilder es una subclase de html :: analizador, solo puedo suponer que el analizador está haciendo lo que puede transformar su documento en HTML válido.

Puede llamar a $ parsedpage-> as_html para ver qué ha hecho el analizador a su HTML. Me da esto:

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

Quizás debería pasar su HTML a través de un validador o HTML :: Tidy, antes de procesarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top