XPath语法是用于在XML和HTML文档中查找信息的语言,通过编写路径表达式可以精准定位到文档中的任意节点或节点集,在网页数据爬取、自动化测试元素定位等场景中应用十分广泛。

XPath基础概念
XPath将XML或HTML文档视为一个树形结构,文档中的每个元素、属性、文本都是树的一个节点,路径表达式就是按照树的结构来定位目标节点的规则。
常见节点类型
- 元素节点:比如HTML中的<div>、<p>标签对应的节点
- 属性节点:比如<div class="content">中的class属性对应的节点
- 文本节点:元素标签内部包含的文本内容对应的节点
基础路径表达式规则
绝对路径与相对路径
绝对路径从根节点开始,以单斜杠/开头,比如/html/body/div表示定位到根节点下的html节点下的body节点下的所有div子节点。
相对路径不以/开头,从当前节点开始查找,比如div/p表示查找当前节点下的div子节点中的所有p子节点。
常用路径表达式符号
| 符号 | 含义 | 示例 |
|---|---|---|
| / | 从根节点或当前节点的直接子节点开始查找 | /bookstore/book 查找bookstore下的直接book子节点 |
| // | 从当前节点下的任意层级节点中查找 | //div 查找文档中所有div节点 |
| . | 表示当前节点 | ./p 查找当前节点下的p子节点 |
| .. | 表示当前节点的父节点 | //p/.. 查找所有p节点的父节点 |
| @ | 用于选取属性节点 | //div[@class] 查找所有带class属性的div节点 |
谓语过滤使用
谓语用来筛选符合条件的节点,放在方括号[]中,常见的谓语用法如下:
- 按索引筛选:索引从1开始,
//div[1]表示查找第一个div节点 - 按属性值筛选:
//div[@class="header"]表示查找class属性值为header的div节点 - 按子节点内容筛选:
//p[text()="示例文本"]表示查找文本内容为示例文本的p节点 - 按节点数量筛选:
//div[count(p)>2]表示查找包含p子节点数量大于2的div节点
通配符与多路径选择
通配符
- *:匹配任意元素节点,比如
//div/*表示查找div节点下的所有子元素节点 - @*:匹配任意属性节点,比如
//div[@*]表示查找所有带任意属性的div节点 - node():匹配任意类型的节点,包括元素、属性、文本等
多路径选择
使用竖线|可以选取多个路径的结果,比如//div|//p表示同时查找所有div节点和所有p节点。
代码示例
以下是一个使用Python的lxml库解析HTML并运用XPath路径表达式的示例:
from lxml import etree
# 示例HTML内容
html_content = """
<html>
<body>
<div class="container">
<p class="title">XPath教程</p>
<p class="content">XPath路径表达式入门</p>
<div class="footer">
<span>版权信息</span>
</div>
</div>
</body>
</html>
"""
# 解析HTML
html = etree.HTML(html_content)
# 查找class为title的p节点文本
title = html.xpath('//p[@class="title"]/text()')
print("标题内容:", title[0])
# 查找container下的所有p节点文本
contents = html.xpath('//div[@class="container"]/p/text()')
print("所有p内容:", contents)
# 查找footer下的span节点文本
footer_span = html.xpath('//div[@class="footer"]/span/text()')
print("页脚span内容:", footer_span[0])
学习建议
入门XPath语法不需要死记硬背所有规则,可以先掌握基础的路径符号、谓语过滤、属性选取这几个核心内容,在实际使用场景中边用边查。日常可以多尝试用浏览器开发者工具的元素选择器练习编写XPath,逐步熟悉不同场景下的表达式写法,很快就能掌握基础的XPath使用能力。