XPath怎么同时选择多种不同名称的节点 path1 | path2

12次阅读

XPath 中用 | 可同时选择多种节点,如 //title | //h1,要求同类型、无空格、独立完整路径,结果自动去重并按文档顺序排列。

XPath 怎么同时选择多种不同名称的节点 path1 | path2

XPath 中用 |(管道符)可以实现“或”逻辑,同时选择多种不同名称的节点,但要注意:这个语法只在 XPath 1.0 及以上版本中有效,且必须确保两个路径返回的是 ** 同类型的结果 **(通常是节点集),并且要写在同一个表达式里,不能有空格隔开(某些解析器对空格敏感)。

正确写法示例

比如想同时选中 <title></title><h1></h1> 节点:

`//title | //h1`

再比如选中所有 div 和所有 span 中的文本节点:

`//div/text() | //span/text()`

常见错误和注意事项

  • 不能加空格:`//title | //h1` ✅,但 `//title | //h1` 中若在 | 前后多加空格,部分老解析器(如某些 DOM 实现或旧版 lxml)可能报错
  • 路径要独立完整:不能写成 `//*(self::title | self::h1)` 来替代(虽然这在 XPath 2.0+ 支持,但 1.0 不支持 `self::` 这种轴写法组合);不过 `//title | //h1` 是最兼容的写法
  • 不支持嵌套“或”结构:像 `//div[@class=’a’ or @id=’b’]` 是属性层面的或,和 `|` 完全不同,别混淆
  • 结果自动去重、按文档顺序 排列:XPath 会合并两个路径结果,并按它们在 HTML/XML 中出现的先后排序,不会重复

替代方案(XPath 1.0 兼容)

如果想用更紧凑的方式匹配多个标签名,可借助 local-name()

`//*[local-name()=’title’ or local-name()=’h1′]`

注意:这种方式适合标签名少且动态变化的场景,但可读性和性能略低于直接用 |

在代码中使用的小提醒

Python 的 lxml 浏览器 DevTools 控制台都支持 `|`;但 Selenium 的 find_element(By.XPATH, ……) 同样支持——只要 XPath 表达式本身合法即可。

例如在 Selenium 中:

`driver.find_elements(By.XPATH, “//input | //textarea”)`

基本上就这些。用 `|` 是最直接、最广泛支持的多路径联合选择方式,不复杂但容易忽略细节。

星耀云
版权声明:本站原创文章,由 星耀云 2025-12-13发表,共计951字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources