
本文讲解如何利用 XPath 的 following-sibling 轴,从已定位的节点出发,准确选取其同级的后续兄弟元素(如紧邻的第二个 div),特别适用于解析结构清晰但无唯一 ID 或 class 的 HTML 标签。
本文讲解如何利用 xpath 的 `following-sibling` 轴,从已定位的节点出发,准确选取其同级的后续兄弟元素(如紧邻的第二个 div),特别适用于解析结构清晰但无唯一 id 或 class 的 html 标签。
在 Web 数据抓取或自动化测试中,常遇到这样一类 HTML 结构:关键信息与标签文本相邻但位于不同子元素中,且缺乏独立标识符(如 id、data-* 属性)。例如以下片段:
<div class="my-3"> <div class="d-flex justify-content-between">Monthly:</div> <div>0 / 30,000</div> </div>
目标是提取值为 0 / 30,000 的 <div> —— 它与含 "Monthly:" 的 <div> 处于同一父级下,且为其紧邻的下一个兄弟节点。
此时,若仅用 //*[normalize-space()='Monthly:'] 只能定位到第一个 div,需进一步沿 DOM 层级横向移动。XPath 提供了 following-sibling:: 轴,专门用于选取当前节点之后的同级兄弟元素。
✅ 正确表达式如下:
//*[normalize-space()='Monthly:']/following-sibling::div
该表达式含义分解:
- //*:匹配任意元素;
- [normalize-space()='Monthly:']:筛选文本内容经空白归一化后等于 "Monthly:" 的元素;
- /following-sibling::div:选取该元素所有后续同级 <div> 元素(注意:默认返回第一个匹配项,在多数解析器如 lxml、Selenium 中即首个)。
⚠️ 注意事项:
- 若父容器中存在多个 div 在 "Monthly:" 后(如 <div>A</div><div>B</div><div>C</div>),上述表达式会返回全部;如需严格限定为紧邻的下一个,可加位置谓词:
//* [normalize-space()='Monthly:']/following-sibling::div[1]
- following-sibling 仅匹配同级元素,不跨层级;若目标在子节点或祖先节点中,应改用 child::、descendant:: 或 parent:: 等轴。
- normalize-space() 对抗换行、缩进和多余空格,强烈建议在匹配可见文本时始终使用,避免因 HTML 格式化导致匹配失败。
? 实战提示:在 Selenium(Python)中可直接使用:
element = driver.find_element("xpath", "//*[normalize-space()='Monthly:']/following-sibling::div")
print(element.text) # 输出:0 / 30,000掌握 following-sibling 是构建健壮、语义化 XPath 的关键能力——它让定位从“静态路径”转向“关系驱动”,显著提升对动态或弱标记 HTML 的适应性。

















