如何使用 HTML::TreeBuilder 查找直系后代



假设我有一个这样的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是您的顶级元素(

相关内容

  • 没有找到相关文章

最新更新