XPath轴(Axes)是什么 aescendant和following-sibling

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
  12

想定位“价格”列对应的数据(¥599):

  • following-sibling:::精准且高效 → //th[text()='价格']/following-sibling::td[1]
  • descendant:: 就不行——因为 td 不是 th 的后代,它们是平级关系
  • 如果目标在更深嵌套里(比如 td 里的 span),才轮到 descendant:: 出场