Domanda

Il Documentazione su CPAN Non spiega davvero questo comportamento se non mi manca qualcosa. Ho messo insieme un codice di prova rapido per illustrare il mio 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";}

Dopo aver eseguito lo script sopra, l'output è:

body : p

body : p        HELLO! 

Visto che tutti i tag sono nidificati uno dopo l'altro, penso che il genitore del primo p Il tag sarebbe h1, e il genitore del secondo p Il tag sarebbe p. Perché la funzione genitore mostra il body tag per entrambi?

È stato utile?

Soluzione

Il tuo HTML non è valido. E dato che HTML :: TreeBuilder è una sottoclasse di HTML :: Parser, posso solo supporre che il parser stia facendo ciò che può per trasformare il tuo documento in HTML valido.

Puoi chiamare $ parsedpage-> as_html per vedere cosa ha fatto il parser al tuo html. Mi dà questo:

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

Forse dovresti passare il tuo HTML tramite un validatore o HTML :: Tidy, prima di elaborarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top