XPath 核心语法全集(2025最新最精炼版)
记住这一篇就够你写 99% 的复杂定位了!
1. 基本路径写法(最重要的 5 种开头)
| 写法 | 含义 | 举例 |
|---|
/ | 从根节点开始(严格一层一层) | /html/body/div |
// | 从任意位置开始找(全局搜索,最常用!) | //div、//input[@name='wd'] |
. | 当前节点 | .//a(从当前节点往下找所有 a) |
.. | 父节点 | ..//span(往上级找) |
* | 通配符,匹配任意元素节点 | //*[@id='kw'] |
2. 节点选择 + 谓词(方括号 [] 是灵魂)
| 语法 | 含义 | 实战例子 |
|---|
//div[1] | 第一个 div(错!容易踩坑) | 错!应该写成 (//div)[1] |
(//div)[1] | 正确:所有 div 中的第 1 个 | 正确写法 |
(//div)[last()] | 最后一个 div | |
(//div)[last()-1] | 倒数第二个 | |
(//div)[position()>3] | 从第 4 个开始的所有 div | |
//div[@class='item'] | class 等于 item 的 div | |
//div[contains(@class,'item')] | class 包含 item(最常用!) | |
//a[starts-with(@href,'https')] | href 以 https 开头 | |
//input[not(@disabled)] | 没有被禁用的输入框 | |
3. 按文本内容定位(爬虫最爱)
| 写法 | 说明 |
|---|
//a[text()='新闻'] | 文本完全精确等于“新闻”(不能有空格) |
//a[contains(text(),'新闻')] | 文本包含“新闻”(只看第一个文本节点) |
//a[contains(.,'新闻')] | 推荐!整个元素所有文本拼接后包含“新闻” |
//*[normalize-space()='登录'] | 去掉前后空格、换行后等于“登录”(最稳!) |
//*[contains(normalize-space(),'立即购买')] | 包含关键词,忽略空格换行 |
4. 轴(Axis)—— 关系定位大杀器(背会就无敌)
| 轴名称 | 含义 | 最常用写法 |
|---|
child:: | 直接子节点(可省略) | //ul/child::li → //ul/li |
parent:: | 直接父节点 | //span/parent::div |
ancestor:: | 所有祖先节点 | //span/ancestor::div[1](最近的 div) |
ancestor-or-self:: | 所有祖先 + 自己 | |
preceding-sibling:: | 同层之前的所有兄弟 | //li[3]/preceding-sibling::li |
following-sibling:: | 同层之后的所有兄弟 | //div/following-sibling::div[1] |
following:: | 当前节点之后所有节点(不限层级) | //input[@id='kw']/following::input[1] |
preceding:: | 当前节点之前所有节点 | |
descendant:: | 所有后代(// 的本质) | //div/descendant::a → //div//a |
descendant-or-self:: | 所有后代 + 自己 | //div//a 的完整写法 |
self:: | 自己 | //div[self::div[@class='active']] |
5. 运算符和函数(最常用的 10 个)
| 类型 | 函数/运算符 | 用途举例 |
|---|
| 字符串 | contains(字符串, '子串') | contains(@class,'btn') |
| starts-with(字符串, '前缀') | starts-with(@id,'login_') |
| normalize-space() | 去首尾空格和换行,最常用! |
| string() | 把节点转成字符串(常用于取价格) |
| 数字 | position() | 当前位置 |
| last() | 最后一个 |
| count(节点集) | 统计数量 |
| 逻辑 | and、or、not() | [@type='text' and @name='wd'] |
| 节点集合 | | | 并集://input | //button |
6. 终极语法速查表(贴在桌边的那张纸)
// 从任意位置找
/ 从根开始(严格层级)
. 当前节点
.. 父节点
* 通配任意元素
@ 属性
text() → 第一个文本节点
. → 当前节点所有文本拼接(推荐用于 contains)
normalize-space() → 干净文本
(position()) → 位置
[last()] → 最后一个
[contains(@class,'abc')] → class 包含 abc
[starts-with(@id,'login')] → id 以 login 开头
[not(@disabled)] → 没被禁用
(//div[@class='item'])[3] → 所有 item 中的第 3 个(一定要加括号!)
掌握上面所有内容,你已经进入 XPath 前 5% 高手行列!
接下来只需要多练,遇到任何网页定位难题,把 HTML 片段发给我,我 10 秒给你写出最稳的 XPath。
要不要现在来 10 道经典实战题,直接上手练?