XPath轴用于定义从当前节点出发的导航方向,如child::、parent::、ancestor::等,结合节点测试和谓词可精准定位XML/HTML中的元素,提升数据提取效率。

在使用XPath进行XML或HTML文档解析时,选取节点是核心操作。除了基本的路径表达式(如//div、/html/body/p),XPath提供了丰富的“轴”(Axis)机制,用于定位与当前节点相关联的其他节点。掌握这些轴的用法,能让你更灵活、精准地抓取所需数据。
什么是XPath轴?
XPath轴定义了从当前节点出发,可以访问的节点方向和范围。每个轴代表一个特定的节点集合,比如父节点、子节点、祖先节点等。轴的基本语法为:
其中:
-
axisname:轴名称,如
child、parent -
nodetest:节点测试,如
div、*(所有元素) - [predicate]:可选条件,用于进一步筛选
常用XPath轴详解
1. child:: —— 子节点轴
选取当前节点的直接子节点。
示例:
-
child::div:选择所有子级元素child::*:选择所有子元素节点child::text():选择所有子文本节点简写:
div等价于child::div2. parent:: —— 父节点轴
选取当前节点的父节点。
示例:
-
parent::*:选择父元素 -
parent::div[@class="container"]:选择父节点是否为特定div
简写:
..等价于parent::*3. ancestor:: —— 祖先节点轴
选取当前节点的所有祖先节点(父、祖父、曾祖父等)。
示例:
-
ancestor::div:选择所有祖先中的div元素 -
ancestor::*[1]:选择最近的一个祖先元素(即父节点) -
ancestor::body:检查是否在body内部
4. descendant:: —— 后代节点轴
选取当前节点的所有后代节点(子、孙、曾孙等)。
示例:
-
descendant::span:选择所有嵌套层级的span -
div/descendant::input:在div内找所有input
简写:
//在路径中表示descendant::,如div//input5. following-sibling:: —— 后面的兄弟节点
选取当前节点之后的同级节点。
示例:
-
following-sibling::li:选择后面所有的li -
following-sibling::li[1]:选择下一个li兄弟 -
h2/following-sibling::p[1]:h2后的第一个p
6. preceding-sibling:: —— 前面的兄弟节点
选取当前节点之前的同级节点。
示例:
-
preceding-sibling::li:前面所有li -
li[3]/preceding-sibling::li[1]:第3个li前的第一个li
7. following:: —— 后面的节点(文档顺序)
选取在当前节点之后的所有节点(按文档顺序,不一定是兄弟)。
示例:
-
h1/following::p:h1之后的所有p标签 - 常用于提取标题后的内容段落
8. preceding:: —— 前面的节点(文档顺序)
选取在当前节点之前的所有节点(按文档顺序)。
示例:
-
p/preceding::h1[1]:当前p之前最近的h1 - 适合反向查找标题或说明文字
9. self:: —— 自身节点
选取当前节点本身。
示例:
-
self::div:如果当前节点是div,则选中 - 常用于条件判断或结合
or使用
10. attribute:: —— 属性节点轴
选取当前节点的属性。
示例:
-
attribute::id或@id:选择id属性值 -
attribute::*或@*:选择所有属性
简写:
@是attribute::的缩写11. namespace:: —— 命名空间轴
选取当前节点的命名空间节点(较少使用)。
示例:
-
namespace::*:列出所有命名空间声明
12. ancestor-or-self:: —— 自身及祖先
包含当前节点及其所有祖先。
示例:
-
ancestor-or-self::div:如果当前是div或其祖先中有div,都会被选中 - 常用于向上查找容器
13. descendant-or-self:: —— 自身及后代
包含当前节点及其所有后代。
示例:
-
descendant-or-self::a:当前如果是a或包含a后代,都匹配 - 等价于
.//a | .[self::a]
实用技巧与注意事项
合理组合轴和谓语,可以实现复杂定位:
- 定位“某个标题后的第一个段落”:
//h3[text()="简介"]/following::p[1] - 查找“有特定类名的父级”:
//*[@id="main"]/ancestor::div[@class="wrapper"] - 获取“兄弟节点中的特定位置”:
//li[@class="active"]/preceding-sibling::li[1]
注意点:
- 轴只影响节点方向,具体结果还需配合节点测试和谓语过滤
- 某些轴(如
following、preceding)按文档顺序排列,可能跨层级 - 性能上,深层遍历(如
descendant::)可能较慢,尽量限定范围
基本上就这些常用的轴。熟练掌握它们,能大幅提升你在爬虫、自动化测试或XML处理中的定位能力。多练习组合使用,你会发现XPath远比想象中强大。










