Wie genau funktioniert die „Eltern“ von HTML :: Treebuilder?
Frage
Das Dokumentation zu CPAN Erklärt dieses Verhalten nicht wirklich, es sei denn, mir fehlt mir etwas. Ich habe einen schnellen Testcode zusammengestellt, um mein Problem zu veranschaulichen:
#!/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";}
Nach dem Ausführen des obigen Skripts lautet die Ausgabe:
body : p
body : p HELLO!
Da alle Tags nacheinander verschachtelt sind, würde ich denken, dass der Elternteil der Ersten p
Tag wäre h1
, und die Eltern der zweiten p
Tag wäre p
. Warum zeigt die übergeordnete Funktion die body
Tag für beide?
Lösung
Ihr HTML ist ungültig. Und da Html :: Treebuilder eine Unterklasse von HTML :: Parser ist, kann ich nur davon ausgehen, dass der Parser das tut, was es kann, um Ihr Dokument in gültige HTML zu verwandeln.
Sie können $ parsedPage-> as_html anrufen, um zu sehen, was der Parser mit Ihrem HTML angetan hat. Es gibt mir das:
<html><head></head><body><h1></h1><p><p>HELLO! </body></html>
Vielleicht sollten Sie Ihre HTML über einen Validator oder HTML :: Tidy übergeben, bevor Sie ihn verarbeiten.