2011-11-30 86 views
1

我想返回我的XPath查询和网页的第一个元素,但不确定为什么这不适用于Google Chrome。我尝试了各种变化,但这一直不成功。如何从XPath中的按钮元素中选择第一个ID?

基本的例子是在我的情况下返回:

INPUT: //button[@data-qtip='Next Page']/@id 
OUTPUT: [id=​"button-1135-btnEl",id=​"button-1101-btnEl"] 

所以我的猜测是,选择第一项可以根据以下步骤,但对我没有工作要做。

INPUT: //button[@data-qtip='Next Page' and position() = 1]/@id 
OUTPUT: [id=​"button-1135-btnEl",id=​"button-1101-btnEl"] 
INPUT: //button[@data-qtip='Next Page']/@id[1] 
OUTPUT: [id=​"button-1135-btnEl",id=​"button-1101-btnEl"] 

回答

5
//button[@data-qtip='Next Page']/@id[1] 

这是XPath的的最常见问题之一。

上述表达式通常不会按预期方式选择(仅)一个节点。

原因?操作者具有比所述的XPath []操作者一个低优先级 -

W3C XPath Specification//缩写以这样的方式,这个伪定义。

因此,像任何表达:

//SomeNode[1] 

选择所有SomeNode节点的每一个是所述第一子SomeNode其父的。在一般情况下,可能有多个这样的节点。

当我们要选择的文件在第一SomeNode节点,那么我们必须用括号覆盖默认的运算符优先级:

(//SomeNode)[1] 

在这种特殊情况下使用

(//button[@data-qtip='Next Page']/@id)[1] 
+0

+1的解释。 – Birei

+0

@Birei:不客气。 –

+0

对我来说,你的文本似乎暗示在这种情况下,''//与任何其他轴都不相似。也许我误解了它,但如果没有,那么它是如何呢?毕竟,也可能出现类似的问题,例如,使用'child :: aa/child :: bb [1]'。是不是更多地关于(待过滤的)节点集合中的每个节点的上下文位置总是独立计算的,并且分组表达式只是改变了上下文并且因此确定了上下文位置的方式? – jasso

1

尝试,如果你未来的XPath命令作品:

INPUT: (//button[@data-qtip='Next Page']/@id)[1]