什么是Xpath?是在XML文档中搜索内容的一门语言,HTML可以看作是xml的一个子集。
目录
1、安装lxml模块
2、导入lxml中的etree子模块
3、Xpath使用方法
3.1.选择节点
3.2.选择属性
3.3.选择文本内容
3.4.使用通配符*过滤节点
3.5.使用中括号[]索引
3.6.使用相对查找
3.7.使用函数
4、全部示例代码
1、安装lxml模块
# PyCharm终端输入
pip install lxml# 使用清华源
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
2、导入lxml
中的etree
子模块
from lxml import etree
etree.XML().xpath()
是Python中用于XML解析的库 lxml
中的一个函数。lxml
是一个高效的XML解析器。另外,可以使用etree.parse("文件名")读取文件进行解析。
具体来说:
etree
是lxml
库中的一个模块,它提供了访问XML文档的接口。XML()
是etree
模块中的一个函数,用于解析XML字符串。xpath()
是etree
模块中的一个方法,用于执行XPath查询。
etree.XML().xpath()
的含义是将一个XML字符串解析为一个lxml
的etree
对象,然后使用这个对象执行XPath查询。
3、Xpath使用方法
XPath表达式通常以 / 开头,/ 表示层级关系,第一个 / 是根节点。
XPath是一种用于在XML文档中定位元素的语言。可使用一系列的语法规则来指定哪些元素应该被选中。xpath()
方法接受一个XPath表达式作为参数,并返回一个包含匹配元素的列表。
若有以下xml文档内容:
xml = '''
<book><id>10010</id><name>蔬菜</name><price>33</price><author><nick id="1">萝卜</nick><nick id="2">豆腐</nick><nick class="a">土豆</nick><nick id="3">白菜</nick><div><nick>西红柿</nick></div><span><nick>番茄</nick></span></author><partner><nick id="4">火锅</nick><nick id="5">麻辣烫</nick></partner>
</book>
'''
3.1.选择节点
使用/
或//
来选择节点。
/book/author/nick
:选择/book/author
的直接子节点nick
。/book/author//nick
:选择/book/author
的所有名为nick
子节点,不论它们在文档中的位置。
# text()为获取文本内容/book/author/nick/text()
/book/author//nick/text()
3.2.选择属性
使用 @来选择元素的属性,如nick节点中的id属性且值为1。
/book/author/nick[@id=1]/text()
如果想要属性的值:
# 得到第i个id的值
/book/author/nick[i]/@id# 得到全部id的值
/book/author/nick/@id
3.3.选择文本内容
使用 text() 来选择节点的文本内
//book/name/text()
3.4.使用通配符*过滤节点
使用通配符 * 表示任意的节点。
/book/author/*/nick/text()# 相当于*代替了div和span,也就是说author和span之间可以是任意字符
/book/author/div/nick/text()
/book/author/span/nick/text()
3.5.使用中括号[]索引
获取/book/author下众多nick中的第一个nick,最后一个nick[last()]
/book/author/nick[1]/text()# 最后一个
/look/author/nick[last()]/text()
3.6.使用相对查找
先提取/book中每一个partner的信息,然后在partner中继续查找,./为当前节点,即partner节点
# 相对路径查询
result = tree.xpath("/book/partner")
for i in result:result1 = i.xpath("./nick/text()") #print(result1)
3.7.使用函数
函数可以用于计算或提取信息。
/book/author/nick[position()=2]/text()
# nick[position()=2]相当于nick[2]
/book/author/nick[2]/text()
count(//nick) # 获取nick节点的数量
4、全部示例代码
from lxml import etree
xml = '''
<book><id>10010</id><name>蔬菜</name><price>33</price><author><nick id="1">萝卜</nick><nick id="2">豆腐</nick><nick class="a">土豆</nick><nick id="3">白菜</nick><div><nick>西红柿</nick></div><span><nick>番茄</nick></span></author><partner><nick id="4">火锅</nick><nick id="5">麻辣烫</nick></partner>
</book>
'''
tree = etree.XML(xml) # 解析xml
# result = tree.xpath("/book") # 获取根节点
# result = tree.xpath("/book/name") # 获取子节点name
# result = tree.xpath("/book/name/text()") # 获取子节点name的文本内容
# result = tree.xpath("/book/author/nick/text()") # 获取author的子nick节点的文本内容
# result1 = tree.xpath("/book/author//nick/text()") # 获取author节点下名为的所有nick节点的文本内容
# result = tree.xpath("/book/author/nick[@id=1]/text()") # 获取id=1的nick节点的文本内容
# result = tree.xpath("/book/author/*/nick/text()") # 获取author节点下所有nick节点的文本内容
# result = tree.xpath("/book/author/nick[1]/text()") # 获取author节点下第一个nick节点的文本内容
# result = tree.xpath("/book/author/nick/@id") # 获取author节点下所有nick节点的id属性值# 相对路径查询
# result = tree.xpath("/book/partner")
# for i in result:
# result1 = i.xpath("./nick/text()") #
# print(result1)# result = tree.xpath("count(//nick)") # 获取nick节点的数量
result = tree.xpath("/book/author/nick[position()=2]/text()") # 获取author节点下第二个nick节点的文本内容
print(result)