一、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]                        获取第一个超链接文本