2012-07-14 44 views
4

假設我有一個HTML樹是這樣的:如何找到HTML :: TreeBuilder的直接後代?

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個例子)。

回答

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 ,它可以讓你找到<div>元素<ul>兒童的一切<li>兒在文件中的任何地方,像這樣的

use HTML::TreeBuilder::XPath; 

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

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

如果您想使用look_down方法,你可以添加一個額外的標準只得到孩子:

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

爲了讓這個頁面完全完成後,我會增加一個選項:

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

(其中$ ul是您的頂級元素)

相關問題