XPath(XML Path Language,XML 路径语言)是一种用于在 XML 或 HTML 文档中定位和选取节点的查询语言 ,由 W3C(万维网联盟)制定为标准。它的核心思想是把文档看作一棵节点树,像文件系统的路径一样,在树中导航并精准定位目标元素。
一、核心基础:节点选取语法
这是 XPath 定位的底层规则,用于指定节点的查找路径,是所有操作的基础:
表格
| 表达式 | 核心描述 | 实战示例 | 示例说明 |
|---|---|---|---|
nodename |
选取该节点的所有子节点 | div |
选取当前节点下所有<div>子标签 |
/ |
层级分隔 / 绝对路径(直接子节点) | /html/body/div |
从根节点开始,选<html>→<body>下的直接<div>子节点 |
// |
全局选取(任意位置的节点) | //div |
选取整个文档中所有<div>标签(无视层级) |
. |
选取当前节点(相对定位) | ./span |
选取当前节点下的直接<span>子节点 |
.. |
选取父节点 | //span/.. |
选取所有<span>标签的父节点 |
@ |
选取属性(基础) | //div[@id] |
选取带有id属性的所有<div>标签 |
二、进阶筛选:谓语(Predicates)
通过[]包裹条件实现精准过滤,是 XPath 定位的核心能力,适配各类精准匹配场景:
表格
| 表达式类型 | 示例 | 示例说明 | 补充说明 |
|---|---|---|---|
| 位置索引 | //head/meta[1] |
选取<head>下第一个<meta>标签 |
索引从 1 开始(非 0),是高频易错点 |
| 末尾定位 | //ul/li[last()] |
选取<ul>下最后一个<li>标签 |
支持偏移:last()-1= 倒数第二个 |
| 位置范围 | //ul/li[position()<3] |
选取<ul>下前 2 个<li>标签 |
支持</>/=/<=/>=等运算符 |
| 属性存在性 | //a[@href] |
选取带有href属性的所有<a>标签 |
仅校验属性是否存在,不限制值 |
| 属性精确匹配 | //div[@id='u1'] |
选取id值为u1的所有<div>标签 |
字符串值需加单 / 双引号 |
| 属性模糊匹配 | //a[contains(@href, 'cve')] |
选取href包含cve的所有<a>标签 |
爬虫提取关联链接常用 |
| 属性开头匹配 | //script[starts-with(@src, '//cdn')] |
选取src以//cdn开头的<script> |
定位第三方资源常用 |
| 多条件联合 | //input[@type='text' and position()=2] |
选取第 2 个type为text的<input> |
支持and/or逻辑运算符 |
三、简化匹配:通配符(Wildcards)
用于 "未知节点 / 属性" 或批量选取场景,简化匹配规则:
表格
| 通配符 | 作用 | 示例 | 示例说明 |
|---|---|---|---|
* |
匹配任意节点 | //div[@id='u1']/* |
选id=u1的<div>下所有直接子节点(不限标签) |
@* |
匹配任意属性 | //meta[@*] |
选取带有任意属性的所有<meta>标签 |
四、批量选取:多路径联合(| 竖线)
你希望我重新整理 XPath 中 "多路径联合选取" 的知识点,这是 XPath 实现批量提取多个不相关节点集的核心能力,以下是结构化、贴合实战的详细解析:
1. 核心语法
多路径联合选取通过 |(竖线) 连接两个或多个独立的 XPath 表达式,最终返回所有表达式匹配结果的 "并集"(按节点在文档中的自然出现顺序排列)。
- 语法格式:
XPath表达式1 | XPath表达式2 | ... | XPath表达式N - 核心逻辑:多个路径无依赖关系,相当于 "同时选取满足任意一个路径的所有节点"。
2. 详细示例(从基础到进阶)
(1)基础示例:选取不同类型的标签
xpath
//title | //meta | //h1
- 作用:同时选取文档中所有
<title>、<meta>和<h1>标签; - 适用场景:爬虫中批量提取网页基础信息(标题、元信息、主标题)。
(2)进阶示例:带筛选条件的多路径
xpath
//div[@class='nav']/a | //ul[@id='menu']/li/a
- 作用:
- 第一部分:选取
class="nav"的<div>下所有<a>标签; - 第二部分:选取
id="menu"的<ul>下所有<li>中的<a>标签; - 最终:合并两部分结果,得到所有导航栏链接。
- 第一部分:选取
- 适用场景:网页导航链接分散在不同标签结构中时,批量提取所有导航链接。
(3)结合谓语 / 通配符的多路径
xpath
//a[contains(@href, 'https')] | //button[@type='submit']
- 作用:同时选取所有带 HTTPS 链接的
<a>标签、所有提交类型的<button>标签; - 适用场景:自动化测试中批量定位 "安全链接" 和 "提交按钮"。
3. 关键使用注意事项
- 结果排序 :合并后的节点按其在文档中的自然出现顺序 排列,而非表达式书写顺序;例:若
<h1>在<title>前,//title | //h1的结果中<h1>会先出现。 - 路径独立性 :每个路径都是独立的,一个路径的语法错误会导致整个表达式失效;例:
//div[@class='nav'] | //ul[@id='menu'(缺少闭合括号)会整体报错。 - 去重特性 :若多个路径匹配到同一个节点,结果中仅保留一次(自动去重);例:
//div | //*[@class='box']若某个<div>刚好有class="box",只会出现一次。
五、实战补充:路径类型与避坑指南
1. 路径类型区分(爬虫 / 自动化首选)
- 绝对路径:以
/开头(如/html/body/div),稳定性差(页面结构变化易失效); - 相对路径:以
./..开头(如./span),灵活性高(优先使用); - 全局路径:以
//开头(如//div[@class='content']),兼顾精准与灵活。
2. 核心易错点
- 索引规则:XPath 索引从 1 开始,而非编程中的 0;
- 通配符范围:
*仅匹配节点,@*仅匹配属性,不可混用; - 多路径逻辑:
|是 "并集" 而非 "逻辑或",结果按文档顺序返回。
总结
- XPath 核心分为基础路径选取 (/、//、.、@)和进阶筛选(谓语、通配符、多路径),后者是精准定位的关键;
- 谓语
[]支持位置、属性、多条件筛选,"索引从 1 开始" 是最易踩坑的点; - 实际开发中优先使用「相对路径 + 谓语筛选」(如
//div[@class='content']/p),兼顾灵活性和精准性。