ChatGPT解决这个技术问题 Extra ChatGPT

XPath 查询以获取元素的第 n 个实例

有一个 HTML 文件(其内容不受我控制)具有多个 input 元素,它们都具有相同的 "search_query" 固定 id 属性。文件的内容可以更改,但我知道我总是想获得第二个具有 id 属性 "search_query"input 元素。

我需要一个 XPath 表达式来执行此操作。我试过 //input[@id="search_query"][2] 但这不起作用。这是此查询失败的示例 XML 字符串:

<div>
  <form>
    <input id="search_query" />
   </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

请记住,以上只是一个示例,其他 HTML 代码可能完全不同,并且 input 元素可以出现在没有一致文档结构的任何地方(除非我保证总会有至少两个 input id 属性为 "search_query" 的元素)。

什么是正确的 XPath 表达式?

好问题,+1。有关问题的完整解释和想要的解决方案,请参阅我的答案。
次要的一点:你永远不应该有一个给定 ID 的元素(因此问题中的 HTML 实际上是无效的)。实际上,浏览器无论如何都会让你这样做,但如果你这样做了,你就会错过使用 ID 的唯一好处,那就是它们表明“我是独一无二的”(而类被设计用于非独特的能指)。
不是小问题@machineghost!它实际上是一个错误! ID代表唯一标识符!

D
Dimitre Novatchev

这是一个常见问题解答:

//somexpression[$N]

表示“查找 //somexpression 选择的每个节点,它是其父节点的 $Nth 子节点”。

你想要的是:

(//input[@id="search_query"])[2]

记住[] 运算符的优先级(优先级)高于 // 缩写。


我喜欢这个答案。我没有考虑优先级问题(我只是假设简单的从左到右的优先级)。
@rlandster:“优先级”这个词可能会令人困惑。 //input[@id='search_query'][2] 的未缩写形式是:/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]
对于那些从谷歌来到这里的人 - 编号从 1 开始 - [1] 是第一个元素,依此类推
奇怪的是,在这些 XPath 查询中,这些类型的数组以 1 开头,让我感到困惑。
@Ivotje50 是的 XPath 序列和数组是基于 1 的
r
rlandster

这似乎有效:

/descendant::input[@id="search_query"][2]

我从 Michael Kay 的“XSLT 2.0 和 XPath 2.0 程序员参考,第 4 版”中得到这个。

XML 路径语言规范 http://www.w3.org/TR/xpath/#path-abbrev 的“缩写语法”部分中还有一条注释提供了线索。


非常感谢这个答案。在我的情况下,接受的解决方案不起作用,因为我在机器人框架中使用 xpath,它不接受以括号开头的路径。然而,这个应该可以解决问题
当我尝试这个时: ${el_my_value}= XML.Get Element ${x} .//isbn
它导致:找到匹配'.//isbn'的多个元素(6)。我怎样才能找到第四个?