假设我有一个这样的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');
它还查找隐藏在 HTML 树中更深<li>
元素。
如何仅找到作为第一个<ul>
元素的直接后代的<li>
元素?我有未知的数量。(我不能像示例中那样只选择前 4 个(。
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
更具表现力,它可以让您在文档中的任何地方找到<ul>
<div>
元素的所有子元素的所有<li>
子元素,如下所示
use HTML::TreeBuilder::XPath;
my $tree = HTML::TreeBuilder->new_from_file('my.html');
my @items = $tree->findnodes('//div/ul/li')->get_nodelist;
使用 look_down 方法,可以添加一个额外的条件来仅获取子项:
my @li_elements = $ul->look_down(_tag => 'li', sub {$_[0]->parent() == $ul});
为了使此页面完美完整,我将再添加一个选项:
@li = grep { $_->tag() eq 'li' } $ul->content_list;
(其中$ul是您的顶级元素(