如何使用HTML :: TreeBuilder找到直接后代?

时间:2012-07-14 23:18:42

标签: html perl parsing html-tree

假设我有一个像这样的HTML树:

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

如何选择标有<li>的{​​{1}}元素?它们是第一个(*)元素的直接后代。

以下是我找到第一个<ul>元素的方法:

<ul>

现在我已经my $ul = $div->look_down(_tag => 'ul'); 了,但是当我这样做时:

$ul

它还会找到隐藏在HTML树中更深层的my @li_elements = $ul->look_down(_tag => 'li'); 个元素。

如何找到第一个<li>元素的直接后代的<li>元素?我的数量不详。 (我不能只选择前4个例子)。

3 个答案:

答案 0 :(得分:8)

您可以使用content_list方法获取HTML::Element对象的所有子节点,因此文档中第一个<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>个孩子,就像这样< / p>

use HTML::TreeBuilder::XPath;

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

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

答案 1 :(得分:5)

如果您想使用look_down方法,您可以添加额外的条件以仅获取子项:

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

答案 2 :(得分:0)

为了完美地完成此页面,我将再添加一个选项:

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

($ ul是你的顶级元素)