XPath作为用于定位XML和HTML文档中节点的查询语言,在实际开发中经常需要同时匹配多种不同名称的节点,比如同时获取文档中的标题节点和段落节点。这时候就可以使用path1 | path2的语法实现多路径并集选择,该语法会返回所有符合path1或者path2规则的节点集合。

path1 | path2语法基本规则
path1 | path2是XPath中的并集运算符,它的作用是把两个或多个路径表达式的结果合并成一个节点集合,最终结果中不会包含重复的节点。需要注意以下几点规则:
- 运算符|左右两侧可以是任意合法的XPath路径表达式,不限制路径的复杂度
- 合并后的节点顺序是按照文档中节点出现的先后顺序排列,不是按照路径的书写顺序排列
- 如果某个路径没有匹配到任何节点,不会影响其他路径的匹配结果
XML文档中的使用示例
假设我们有如下结构的XML文档,需要同时选择所有的<book>节点和<magazine>节点:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book>
<title>编程入门</title>
<price>59.9</price>
</book>
<magazine>
<name>科技周刊</name>
<issue>2023年第10期</issue>
</magazine>
<book>
<title>算法详解</title>
<price>79.9</price>
</book>
</library>
对应的XPath表达式可以写成:
//book | //magazine
该表达式会返回library下的所有<book>节点和<magazine>节点,执行结果包含两个book节点和一个magazine节点,顺序和文档中出现的顺序一致。
HTML文档中的使用示例
在HTML爬取场景中,经常需要同时提取不同层级的同类内容,比如同时获取文章中的<h2>标题和<p>段落内容,假设HTML结构如下:
<div class="article">
<h2>第一章 基础概念</h2>
<p>本节介绍基本定义</p>
<h3>1.1 术语说明</h3>
<p>术语解释内容</p>
<h2>第二章 进阶用法</h2>
<p>进阶内容说明</p>
</div>
如果需要同时选择所有<h2>和<p>节点,XPath表达式可以写成:
//div[@class="article"]/h2 | //div[@class="article"]/p
执行该表达式后,会返回两个h2节点和三个p节点,按照文档中出现的顺序排列,不会重复返回节点。
多路径组合的扩展用法
path1 | path2语法支持同时组合多个路径,不止两个路径,比如需要同时选择h2、h3、p三种节点,可以写成:
//h2 | //h3 | //p
也可以结合属性过滤条件,比如同时选择class为title的div节点和class为content的span节点:
//div[@class="title"] | //span[@class="content"]
使用注意事项
- 不要混淆|运算符和逻辑或,XPath中的逻辑或是
or关键字,用于谓语过滤,比如//*[@class="a" or @class="b"]是选择class为a或者b的节点,和path1 | path2的用途不同 - 如果路径中包含命名空间,需要提前声明命名空间再使用并集语法,否则可能无法匹配到对应节点
- 并集运算的结果节点集合是无序的?不对,实际是按照文档顺序,这点需要注意和某些编程语言的集合合并逻辑区分
Python中验证XPath并集语法
可以使用Python的lxml库验证上述语法,示例代码如下:
from lxml import etree
# 解析XML示例
xml_content = """<?xml version="1.0" encoding="UTF-8"?>
<library>
<book><title>编程入门</title></book>
<magazine><name>科技周刊</name></magazine>
<book><title>算法详解</title></book>
</library>"""
xml_tree = etree.fromstring(xml_content.encode("utf-8"))
# 使用并集语法选择book和magazine节点
nodes = xml_tree.xpath("//book | //magazine")
for node in nodes:
print(etree.tostring(node, encoding="utf-8").decode("utf-8"))
执行上述代码会依次输出两个book节点和一个magazine节点的内容,符合预期结果。
XPath节点选择path1_or_path2XML解析HTML爬取修改时间:2026-07-02 09:12:32