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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top