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

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