XPath轴定义节点间相对关系,descendant::查找所有后代(不含自身),等价于//;following-sibling::仅匹配同父级后续兄弟节点,不跨层。

XPath轴(Axes)是XPath中用于定义“从当前节点出发,朝哪个方向查找”的定位指令。它不依赖固定层级结构,而是描述节点之间的相对关系,比如父子、兄弟、祖先、后代等。掌握轴,就能绕过HTML结构不稳定的问题,写出更鲁棒的定位表达式。
descendant:: 轴:找所有后代,不管隔几层
descendant:: 选取当前节点的所有**后代节点**(子、孙、曾孙……),但不包括自己。它是 // 的完整写法。
-
//div//p等价于//div/descendant::p—— 找 div 下任意深度的 p 元素 - 常用于目标元素嵌套深、父级结构易变的场景,比如商品列表里层层包裹的“价格”span
- 注意:它不匹配当前节点自身;如需包含自己,用
descendant-or-self::
following-sibling:: 轴:只找同级的“后辈兄弟”
following-sibling:: 选取当前节点**之后的所有同级节点**(即同一父元素下、在它后面出现的兄弟节点),不跨层、不进子树。
-
//th[text()='价格']/following-sibling::td[1]→ 定位“价格”表头右边第一个单元格(通常是数值) -
//input[@name='username']/following-sibling::span[@class='error']→ 用户名输入框后紧跟的错误提示 - 关键区别:它不会匹配子节点、祖先节点,也不会跳到其他父容器下的节点,非常“守规矩”
两个轴的典型对比
假设 HTML 片段如下:
想定位“价格”列对应的数据(¥599):
- 用
following-sibling:::精准且高效 →//th[text()='价格']/following-sibling::td[1] - 用
descendant::就不行——因为 td 不是 th 的后代,它们是平级关系 - 如果目标在更深嵌套里(比如 td 里的 span),才轮到 descendant:: 出场











