4 Stimmen

Wie findet man mit HTML::TreeBuilder nur die direkten Nachfahren?

Angenommen, ich habe einen HTML-Baum wie diesen:

div
`- ul
   `- li          (*)
   `- li          (*)
   `- li          (*)
   `- li          (*)
      `- ul
         `- li
         `- li
         `- li

Wie wähle ich die <li> Elemente, die markiert sind mit (*) ? Sie sind direkte Nachkommen der ersten <ul> Element.

So finde ich die erste <ul> Element:

my $ul = $div->look_down(_tag => 'ul');

Jetzt habe ich die $ul aber wenn ich Dinge tue wie:

my @li_elements = $ul->look_down(_tag => 'li');

Außerdem findet sie <li> Elemente, die tiefer im HTML-Baum vergraben sind.

Wie finde ich nur die <li> Elemente, die direkte Nachfahren des ersten Elements sind <ul> Element? Ich habe eine unbekannte Anzahl von ihnen. (Ich kann nicht einfach die ersten 4 wie im Beispiel auswählen).

8voto

Borodin Punkte 124906

Sie können alle Kinder einer HTML::Element Objekt unter Verwendung der content_list Methode, so dass alle Kindknoten des ersten <ul> Element des Dokuments wäre

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new_from_file('my.html');

my @items = $tree->look_down(_tag => 'ul')->content_list;

Es ist jedoch viel aussagekräftiger, wenn man HTML::TreeBuilder::XPath mit der Sie alle <li> Kinder von <ul> Kinder von <div> Elemente an einer beliebigen Stelle des Dokuments, etwa so

use HTML::TreeBuilder::XPath;

my $tree = HTML::TreeBuilder->new_from_file('my.html');

my @items = $tree->findnodes('//div/ul/li')->get_nodelist;

5voto

Snorri Punkte 446

Wenn Sie die look_down-Methode verwenden möchten, können Sie ein zusätzliches Kriterium hinzufügen, um nur die Kinder zu erhalten:

my @li_elements = $ul->look_down(_tag => 'li', sub {$_[0]->parent() == $ul});

0voto

Bintz Punkte 744

Um diese Seite perfekt zu machen, füge ich noch eine weitere Option hinzu:

@li = grep { $_->tag() eq 'li' } $ul->content_list;

(Wobei $ul Ihr Top-Level-Element ist)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X