为什么跟随XPath语句返回所有“a”元素?

时间:2010-08-19 03:53:59

标签: perl xpath

print $tree->findvalue('//a[1]');

我在perl中使用HTML::TreeBuilder::XPath。现在我希望上面的语句返回第二个“a”元素的值,但它返回页面中所有“a”元素的值。我不明白为什么?

2 个答案:

答案 0 :(得分:8)

你拥有的东西应该首先归还每个元素的孩子 所以//a[1]将按如下方式工作(结果将是2个节点):

X
 Y
  a <-- give you this
  a
Z
 a <-- and this
 a

尝试(//a)[1]而不是

答案 1 :(得分:3)

XPATH表达式在文档的每个级别查找所有a元素,谓词过滤器在每一步选择第一个a

因此,根据XML的结构,您可能无法获得每个 a元素(如果有多个a是兄弟姐妹,那么您只会得到这些兄弟姐妹中的第一个)。

但是,如果您打算只选择文档中的第一个a,则可以使用以下表达式:(//a)[1]

在括号中包含//a的选择会创建一个集合,然后应用谓词过滤器,选择集合中的第一个,而不是在{{的每一步遇到的第一个a 1}}。