XPath怎么选择第一个和最后一个节点 position()和last()

16次阅读

XPath中选第一个节点用[1]或[position()=1],选最后一个必须用[last()];注意括号改变作用域,如(//a)[last()]取全部a中最后一个,而//a[last()]取各父元素下最后一个a。

XPath怎么选择第一个和最后一个节点 position()和last()

XPath 中选择第一个和最后一个节点,主要靠 position()last() 这两个函数配合位置谓词(即方括号 [])来实现。关键不是单独用它们,而是用在路径末尾的条件过滤中。

选第一个节点:用 [position() = 1] 或简写 [1]

这是最常用也最推荐的方式。XPath 支持两种等价写法:

  • //div[@class="item"][1] —— 简洁直观,直接取匹配到的所有 div[@class="tuc-19bc10f7-ad92c6-0 item tuc-19bc10f7-ad92c6-0"] 中的第 1 个
  • //div[@class="tuc-19bc10f7-ad92c6-0 item tuc-19bc10f7-ad92c6-0"][position() = 1] —— 语义更明确,但写法稍长

⚠️ 注意:[1] 是针对当前路径“结果集”的序号,不是文档中全局第 1 个。比如 //ul/li[1] 表示每个 ul 下的第一个 li(可能返回多个),而 (//ul/li)[1] 才是整个文档中第一个 li(加括号改变优先级)。

选最后一个节点:必须用 [last()]

不能写成 [position() = last()](虽然语法合法,但冗余),直接用 [last()] 更清晰高效:

  • //div[@class="tuc-19bc10f7-ad92c6-0 item tuc-19bc10f7-ad92c6-0"][last()] —— 取所有匹配节点中的最后一个
  • (//ul/li)[last()] —— 加括号确保是整个结果集的最后一个 li

? last() 返回的是当前上下文节点列表的总数量,所以 [last()] 就等于取索引为总数的那个节点(即末位)。

常见误区和细节

  • 别漏括号:想取“所有 a 标签中最后一个”,写 (//a)[last()];写成 //a[last()] 是每个父元素下最后一个 a
  • position() 从 1 开始计数,不是 0
  • last() 只能在谓词中使用,不能单独写 last() 当表达式
  • 如果结果为空,[1][last()] 都不返回任何节点,不会报错

基本上就这些。用熟 [1][last()] 这两个写法,再注意括号控制作用域,就能准确抓取首尾节点了。

text=ZqhQzanResources