XPath:从入门到能用
1. 什么是 XPath?
XPath 全称 XML Path Language,是一种用于在 XML(Extensible Markup Language)或 HTML 文档中查找节点的语言。
它常用于:
- Web 爬虫(如 Scrapy、lxml)
- 自动化测试(如 Selenium、Appium)
- XML 数据解析
如果把 HTML 看作一棵“标签树”,XPath 就是按照一定规则在这棵树中找到你想要的元素。
2. 基本语法结构
XPath 的路径书写类似于文件路径:
符号 | 含义 |
---|---|
/ | 从根节点开始,获取直接子节点 |
// | 从当前节点开始,获取所有符合条件的子孙节点 |
. | 当前节点 |
.. | 父节点 |
@ | 选取属性 |
例子:
/html/body/div
表示 HTML → body → div 的路径(只找直接子节点)。
//div
表示文档中所有的 <div>
元素,不管层级。
//div[@class="container"]
表示文档中所有 class 属性值为 container
的 <div>
标签。
3. 常用节点选择方式
3.1 按标签名查找
//p # 找出所有<p>标签
/html/body/h1 # 找根路径下的<h1>
3.2 按属性查找
//div[@id="main"] # id=main 的<div>
//input[@name="username"] # 表单中 name=username 的<input>
3.3 属性值模糊匹配
//div[contains(@class, "main")] # class 中包含 main
//a[starts-with(@href, "https")] # href 以 https 开头
3.4 按文本内容查找
//a[text()="登录"] # 文本正好是“登录”
//a[contains(text(), "注册")] # 文本包含“注册”
3.5 按层级关系查找
//div/span # div 的子孙节点 span
//div/* # div 的所有直接子元素
4. 位置匹配
有时候多个节点都匹配,我们只要第几个:
(//div[@class="item"])[1] # 第一个匹配的 item
(//li)[last()] # 最后一个<li>
5. 获取节点内容
在 HTML 解析中(以 Python + lxml 为例):
from lxml import etreehtml = """
<html><body>
<div id="main">Hello</div>
<a href="https://example.com">点击</a>
</body></html>
"""tree = etree.HTML(html)# 1. 获取文本
text = tree.xpath('//div[@id="main"]/text()')
print(text) # ['Hello']# 2. 获取属性值
href = tree.xpath('//a/@href')
print(href) # ['https://example.com']
6. 综合案例
假设 HTML:
<ul><li class="item">苹果</li><li class="item">香蕉</li><li class="item">橙子</li>
</ul>
获取所有水果名:
//li[@class="item"]/text()
返回:['苹果', '香蕉', '橙子']
获取第二个水果名:
(//li[@class="item"]/text())[2]
返回:香蕉
7. XPath 与 CSS 选择器的对比
- CSS 语法更短,适合前端开发(如
div#main > p.title
)。 - XPath 功能更强大,比如可以:
- 按文本内容查找
- 按数字位置查找
- 结合逻辑条件(and / or)
很多时候,两者可以互换使用,但在爬虫和解析中,XPath 的自由度更高。
8. 常用技巧总结
//
可以从任意位置查找节点,最常用。[ ]
用于添加过滤条件(属性、文本、位置)。@attr
获取属性值,text()
获取标签的纯文本。contains()
、starts-with()
常用于模糊匹配。( ... )[n]
取第 n 个匹配结果。
✅ 小练习:
给你一段 HTML:
<div class="news"><h2>今日热点</h2><p class="summary">今天的头条是关于...</p><a href="/readmore">阅读全文</a>
</div>
要求写出 XPath 表达式:
- 取出标题文字 今日热点
- 获取摘要文字
- 获取阅读全文链接的 href
答案参考:
1. //div[@class="news"]/h2/text()
2. //p[@class="summary"]/text()
3. //div[@class="news"]/a/@href