In che modo funziona esattamente la funzione "genitore" di HTML :: TreeBuilder?
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?
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.