Xpath模块
# Xpath模块
# 介绍
xpath全称为XML Path Language它是一种小型的查询语言,和BeautifulSoup类似,都是用于在XML以及HTML文档中定位、查询和提取节点。它通过路径表达式描述节点之间的层级关系,类似文件系统的路径,能够快速定位单个节点、节点集合或属性。
XPath属于lxml库模块,所以首先要安装库lxml。
# 常见使用场景
数据抽取:从 XML/HTML 中快速抓取结构化信息(如爬虫、日志解析)。
配置文件读取:在配置 XML 中定位特定节点或属性。
自动化测试:Selenium、Appium 等工具通过 XPath 定位 UI 元素。
XML 转换:XSLT 中的节点选择与模板匹配。
文档校验:使用 XPath 断言 XML 文档结构是否符合规范。
# 常用轴
轴用于描述节点之间的关系,常见的有:
child(子节点)descendant(后代节点)parent(父节点)ancestor(祖先节点)following-sibling(后续兄弟)preceding-sibling(前置兄弟)
示例:
//book/ancestor::bookstore选取所有book元素的祖先bookstore节点。
# 常用函数
| 函数 | 作用 | 示例 |
|---|---|---|
text() | 取节点文本 | //title/text() |
contains() | 包含判断 | //book[contains(@category,'fiction')] |
starts-with() | 前缀判断 | //author[starts-with(.,'张')] |
position() | 位置索引 | //book[position()=1] |
last() | 最后一个节点 | //book[last()] |
string-length() | 字符串长度 | //title[string-length()>5] |
# 基本语法
| 语法 | 含义 | 示例 |
|---|---|---|
/ | 从根节点开始的绝对路径。 | /bookstore/book |
// | 从当前节点向下任意层级查找。 | //title |
. | 当前节点。 | ./author |
.. | 父节点。 | ../price |
@ | 属性选择。 | //book/@category |
* | 通配符,匹配任意节点。 | //*/price |
[] | 谓词(过滤条件)。 | //book[price>30] |
# 逻辑运算
XPath还能通过布尔运算符以及比较运算符来实现条件判断和组合。
布尔运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
and | 逻辑与,两个子表达式都为真才返回真 | //book[price>30 and @category='fiction'] |
or | 逻辑或,只要其中一个子表达式为真即返回真 | //book[@category='history' or @category='science'] |
not() | 逻辑非,对表达式取反 | //book[not(@category='fiction')] |
这些运算符只能在 谓词(
[...])内部使用,且not()的优先级最高,随后是and,最后是or。
比较运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
= | 等于(数值、字符串或节点集) | //author[.='余华'] |
!= | 不等于 | //book[price!=45] |
< | 小于 | //book[price<20] |
<= | 小于或等于 | //book[price<=30] |
> | 大于 | //book[price>50] |
>= | 大于或等于 | //book[price>=100] |
# 解析HTML文档
from lxml import etree
tree = etree.HTML(html)
1
2
3
2
3
# 通过Xpath语法查找标签
Python
## 使用selector.xpath()函数即可
# 当前节点是整个文档,所以该语句表示查找文档中所有的a标签,会将结果通过列表返回
a_list = tree.xpath("//a")
# 获取a列表第一个a标签的href属性的值
a_list[0].xpath('./@href')
# 获取a列表第一个a标签的文本
a_list[0].xpath('./text()')
# 查找所有id属性等于head并且class属性等于s_down的div标签
tree.xpath('//div[@id="head" and @class="s_down"]')
# 找所有包含id属性的div节点
tree.xpath('//div[@id]')
# 查找所有id属性等于maincontent的div标签
tree.xpath('//div[@id="maincontent"]')
# 获取li标签name为xx的里面的文本内容
tree.xpath('//li[@name="xx"]//text()')
# 获取第1个li标签
tree.xpath('//li[1]/a/text()')
# 获取倒数第2个li标签
tree.xpath('//li[last()-1]/a/text()')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
浏览器
直接在开发者工具的查看器中,使用搜索栏输入Xpath语法进行查找。
或者在控制台通过$x("Xpath语法")进行查找。