XPath基础
开始
XPath是一门在XML文档中查找信息的语言,通常用于HTML文档的解析,使用路径表达式可以选择文档中的节点
路径选择
有两种路径选择方式
/
:选择直接子节点//
:选择所有子孙节点
e.g. 对于下面的文档,选择其中的两个price
节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<title class="my-class">Hello</title>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
两种方式的表达式分别如下
/bookstore/book/price
//price
获取节点内容的方式
获取节点文本:
text()
1
//title/text()
获取节点属性:
@attr
1
//title/@class
路径表达式组合:使用|
组合两个路径表达式
1
//price | //title
节点过滤
在节点后加上[]
,可以在当前节点集中进行过滤,[]
中可以进行两类过滤
- 按指定位置过滤:选择指定位置的节点,从1开始
- 按逻辑表达式过滤:选择满足条件的节点
选择指定位置的节点
1
2
3
//div[1] # 选择第一个节点
//div[last()] # 选择最后一个节点
//div[position()=3] # 选择第三个节点
选择满足条件的节点
1
2
3
4
5
6
7
8
9
10
11
12
13
# 相等匹配(xpath支持比较匹配和运算,但使用较少,不再记录)
//div[text()='hello'] # 根据文本内容筛选
//div[@class='my-class'] # 根据属性值筛选
# 模糊匹配
//div[contains(text(), 'hello')] # 文本内容包含
//div[starts-with(text(), 'hello')] # 文本内容开头
//div[contains(@class, 'hello')] # 属性值包含
//div[starts-with(@class, 'hello')] # 属性值开头
# 逻辑组合
//div[text()='hello' and @class='my-class']
//div[text()='hello' or @class='my-class']
注意,节点过滤是针对单个层级路径下的节点集进行过滤,例如下面的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book>
<price id="book1-price1">29.99</price>
<price id="book1-price2">29.99</price>
</book>
<book>
<price id="book2-price1">39.95</price>
<price id="book2-price2">39.95</price>
</book>
</bookstore>
当使用//price
时会选择全部四个price
节点,此时筛选节点//price[1]
,对每个层级路径都会进行一次过滤,即筛选后选择了id为book1-price1
和book2-price1
的节点
lxml库
本文由作者按照 CC BY 4.0 进行授权