一、XPath 基本概念
XPath 用路径(Path)来定位节点:
/
:根节点或子节点
//
:从任意位置匹配后代节点
.
:当前节点
..
:父节点
@
:属性
二、常见路径语法
表达式 | 含义 | 示例 |
---|
/html/body/div
| 绝对路径,从根节点开始 | 精确到特定 div |
//div
| 选取所有 div 节点 | 匹配任意层级 |
./div
| 当前节点下的 div 子节点 | 相对路径 |
//div[@id="main"]
| 选取 id=main 的 div 节点 | 属性匹配 |
//a[@class="link"]/text()
| 选取 class=link 的 a 标签文本 | 提取文本 |
//a/@href
| 选取所有 a 标签的 href 属性 | 提取链接 |
三、常见条件筛选(谓语)
表达式 | 含义 | 示例 |
---|
//div[1]
| 选取第一个 div | 索引从 1 开始 |
//ul/li[last()]
| 选取最后一个 li | 使用 last() |
//ul/li[position()<3]
| 前两个 li | 位置比较 |
//div[@id="main" and @class="content"]
| 多条件匹配 | and / or |
//div[contains(@class,"main")]
| 属性包含子串 | 模糊匹配 |
//span[text()="招标公告"]
| 文本精确匹配 | 直接比对文本 |
//p[contains(text(),"中标")]
| 文本模糊匹配 | 模糊匹配文本 |
四、节点轴(Axes)
轴(Axis)是用来描述节点间关系的,比如父节点、兄弟节点等。
表达式 | 含义 | 示例 |
---|
//div/parent::*
| div 的父节点 | 上级节点 |
//div/ancestor::*
| 所有祖先节点 | 向上查找 |
//div/child::p
| div 的直接子 p 节点 | 子节点 |
//div/descendant::span
| div 的所有后代 span | 深层匹配 |
//div/following-sibling::p
| div 后面的兄弟 p | |
//div/preceding-sibling::p
| div 前面的兄弟 p | |
五、文本与属性提取
目标 | 语法 | 示例 |
---|
获取文本 | text()
| //div[@id="title"]/text()
|
获取所有文本(包括子节点) | .//text()
| //div[@class="content"]//text()
|
获取属性 | @属性名
| //img/@src
|
获取多个属性 | //@href
| 匹配所有 href |
六、常用函数
函数 | 含义 | 示例 |
---|
contains(a,b)
| 包含 | //a[contains(@href, "page")]
|
starts-with(a,b)
| 以某字符串开头 | //div[starts-with(@id,"item")]
|
text()
| 文本节点 | //p/text()
|
string(.)
| 整个节点的所有文本 | string(//div[@id="content"])
|
normalize-space()
| 去除多余空格 | normalize-space(//p/text())
|
count()
| 统计数量 | count(//tr)
|
七、常见示例汇总
//div[@class="news-item"]/a/text() 获取新闻标题
//div[@class="news-item"]/a/@href 获取新闻链接
//table[@id="data"]/tr[2]/td[3]/text() 获取第二行第三列文本
//span[contains(text(),"中标公告")] 模糊匹配文本节点
//div[@id="main"]//img/@src 获取 div 下所有图片
(//ul/li/a/text())[1] 获取第一个超链接文本