假设我有一个像这样的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个例子)。
答案 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是你的顶级元素)