4

次のようなHTMLツリーがあるとします。

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

<li>でマークされている要素を選択するにはどうすればよい(*)ですか?それらは最初の<ul>要素の直接の子孫です。

これが私が最初の<ul>要素を見つける方法です:

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

$ul、私は持っていますが、私が次のようなことをするとき:

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

また<li>、HTMLツリーの奥深くに埋め込まれている要素も検出します。

<li>最初の要素の直接の子孫である要素だけを見つけるにはどうすればよい<ul>ですか?数は不明です。(例のように最初の4つだけを選択することはできません)。

4

3 に答える 3

8

HTML::Elementメソッドを使用してオブジェクトのすべての子を取得できるため、ドキュメントの最初の要素content_listのすべての子ノードは次のようになります。<ul>

use HTML::TreeBuilder;

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

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

ただし、を使用する方がはるかに表現力があります。これにより、ドキュメント内の任意の場所にある要素の子のすべての子を次のHTML::TreeBuilder::XPathように見つけることができます。<li><ul><div>

use HTML::TreeBuilder::XPath;

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

my @items = $tree->findnodes('//div/ul/li')->get_nodelist;
于 2012-07-15T00:16:46.317 に答える
5

look_downメソッドを使用する場合は、子のみを取得するための条件を追加できます。

my @li_elements = $ul->look_down(_tag => 'li', sub {$_[0]->parent() == $ul});
于 2012-07-15T00:41:26.023 に答える
0

このページを完全に完成させるために、もう1つのオプションを追加します。

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

(ここで、$ ulは最上位の要素です)

于 2016-12-08T23:28:18.530 に答える