如何从XPath中的button元素中选择第一个id?

use*_*374 2 html xhtml xpath google-chrome

我试图返回我的XPath查询和网页的第一个元素,但不确定为什么这不适用于谷歌浏览器.我尝试了各种各样的变化,但这是不成功的.

基本的例子在我的案例中返回:

INPUT: //button[@data-qtip='Next Page']/@id
OUTPUT: [id=?"button-1135-btnEl",id=?"button-1101-btnEl"]
Run Code Online (Sandbox Code Playgroud)

所以我的猜测是选择第一项可以按照以下方式完成,但对我来说都没有用.

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"]
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 5

//button[@data-qtip='Next Page']/@id[1]
Run Code Online (Sandbox Code Playgroud)

这是XPath中最常见的FAQ之一.

上述表达式通常不会(仅)选择一个节点.

原因?

W3C XPath规范中,//缩写的定义方式使得此伪运算符的优先级低于XPath []运算符.

因此,任何表达式如:

//SomeNode[1]
Run Code Online (Sandbox Code Playgroud)

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

当我们想要选择SomeNode文档中的第一个节点时,我们必须使用括号覆盖默认的运算符优先级:

(//SomeNode)[1]
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下使用:

(//button[@data-qtip='Next Page']/@id)[1]
Run Code Online (Sandbox Code Playgroud)