【即是过客】《XPath合集001》XPath 基本语法 —— 从入门到精通:全面掌握网页元素定位技术
评论
收藏

【即是过客】《XPath合集001》XPath 基本语法 —— 从入门到精通:全面掌握网页元素定位技术

经验分享
即是过客
2025-07-19 17:08·浏览量:2166
即是过客
影刀专家
影刀认证工程师
发布于 2025-07-19 14:11更新于 2025-07-19 17:082166浏览

一、XPath 基础概念

什么是 XPath?

XPath(XML Path Language)是一种专门用于在XML和HTML文档中查找信息的查询语言。它通过路径表达式的方式,允许开发者通过描述元素之间的层次关系和属性特征来精确定位文档中的节点。

XPath的核心价值在于:

  • 提供了一种强大的文档导航方式
  • 支持精确和模糊匹配
  • 可以处理复杂的文档结构
  • 是Web自动化测试和数据抓取的基础工具


📄 XPath 的应用场景

  1. XML文档解析:XPath最初设计用于XML文档导航,是处理XML数据的标准工具
  2. Web自动化测试:Selenium等工具广泛使用XPath定位网页元素
  3. 网页数据抓取:爬虫程序使用XPath提取网页中的特定数据
  4. RPA流程自动化:如咱们的影刀RPA等工具可以用XPath进行元素定位
  5. 文档转换:XPath常与XSLT配合使用转换XML文档结构


⚙️ 安装和配置XPath工具

推荐工具XPath Tool(浏览器扩展插件)

安装步骤:

  1. 打开Chrome网上应用店
  2. 搜索"XPath Tool"
  3. 点击"添加至浏览器"

或者直接打开 XPath Tool - Microsoft Edge Addons  安装使用(Edge浏览器)【别忘了写个好评 偷笑

其他浏览器使用方法: https://kdocs.cn/l/cdD4SA89Y0kr



二、XPath 基本语法

💬 节点选择:/ 和 // 的区别

XPath中最基本的两种路径表达式:

  1. 绝对路径(/):从根节点开始逐级定位 示例:/html/body/div[1]/span 特点:依赖页面结构,一旦结构变化容易失效
  2. 相对路径(//):从任意位置开始查找匹配节点 示例://div[@class='header']//a 特点:更灵活稳定,推荐优先使用
维度/(绝对路径)//(相对路径,后代路径)
起始点只能从文档根节点开始可从任意位置开始(相对当前节点)
搜索范围仅匹配直接子节点(一层深度)递归搜索所有后代节点(任意深度)
语法位置必须以 / 开头(如 /bookstore/book可出现在路径任意位置(如 book//title
性能更快(无需递归遍历)较慢(需检查所有后代)
典型场景精确定位直接子节点(如根元素、一级子节点)查找嵌套层级未知的元素(如所有 <p> 标签)
示例对比/html/body/div 仅选中 <body> 的直接子级 <div>//div 选中文档中所有 <div>(无论嵌套多深)
组合使用/bookstore/book/title(绝对路径)/bookstore//titlebookstore 内所有 title
易错点遗漏层级会匹配失败可能意外选中深层嵌套的同名节点

🟠 一句话总结/ 是“直线路径”,// 是“地毯式搜索”。


🔢 通配符使用

XPath提供了多种通配符来简化表达式:

  1. *:匹配任何元素节点 示例://*[@id='content'] 匹配任何id为content的元素
  2. @*:匹配任何属性节点 示例://div[@*] 匹配所有带属性的div元素
  3. node():匹配任何类型的节点 示例://div/node() 匹配div的所有子节点


📝 轴(Axes)定位

轴定义了节点之间的关系方向,是XPath的高级功能:

轴名称说明示例
child::当前节点的子节点         //div/child::span
parent::当前节点的父节点         //span/parent::div
ancestor::当前节点的所有祖先节点    //span/ancestor::div
descendant::当前节点的所有后代节点    //div/descendant::span
following::文档中当前节点之后的所有节点 //div/following::span
preceding::文档中当前节点之前的所有节点 //div/preceding::span
following-sibling::当前节点之后的所有同级节点 //li/following-sibling::li
preceding-sibling::当前节点之前的所有同级节点 //li/preceding-sibling::li


⏳ 使用谓词(Predicates)进行过滤

谓词用于对节点集进行过滤,写在方括号[]中:

  1. 位置过滤: //div[1]:选择第一个div元素 //div[last()]:选择最后一个div元素 //div[position()>1]:选择位置大于1的div元素
  2. 属性过滤: //div[@id='main']:选择id为main的div //a[@href]:选择所有带href属性的a标签
  3. 文本过滤: //p[text()='Hello']:选择文本内容为Hello的p标签 //p[contains(text(),'World')]:选择文本包含World的p标签
  4. 逻辑运算: //input[@type='text' and @name='user']:同时满足两个条件 //div[@class='header' or @class='footer']:满足任一条件


🌱 练习题

给定以下HTML片段:

<div class="container">
  <div id="header" class="header">
    <h1>网站标题</h1>
    <nav>
      <ul>
        <li><a href="/home">首页</a></li>
        <li><a href="/news">新闻</a></li>
        <li class="active"><a href="/about">关于我们</a></li>
      </ul>
    </nav>
  </div>
  <div class="content">
    <article>
      <h2>文章标题</h2>
      <p class="intro">文章简介...</p>
      <p>文章正文内容...</p>
    </article>
  </div>
</div>

请编写XPath表达式实现以下选择(对应问题及答案回复评论):

  1. 选择所有li元素
  2. 选择class为"active"的li元素
  3. 选择文章中的第一个p元素
  4. 选择nav元素下的所有a元素
  5. 选择文本包含"文章"的所有元素


⭐掌握这些基础语法后,已经可以处理大多数元素定位需求。在实际应用中,建议多使用相对路径和属性组合,这样的XPath表达式更加稳定可靠。

本合集后续将会继续更新,下期内容:XPath 函数与操作符



收藏26
全部评论1
最新
发布评论
评论