XPath是一种用于在XML文档中定位节点的查询语言,XPath模块则是指用于解析和查询XML文档中XPath表达式的工具或库。
XPath模块通常由编程语言或应用程序提供,例如Java中的XPath API,Python中的lxml库,或者在浏览器中使用JavaScript的XPath实现等。通过使用XPath模块,可以方便地在XML文档中找到所需的数据或节点,使得XML文档的处理更加高效和便捷。
在Python中,我们可以使用许多XPath模块来处理XML文档,例如lxml、xml.etree.ElementTree、xml.dom等。其中,lxml是最常用的XPath模块之一,因为它非常高效且易于使用。
要使用lxml模块,首先需要安装它。可以通过使用pip包管理器来安装它,使用命令
pip install lxml
将会使用到的Book案例代码:
第一本:舌尖上的中国
美味生活
李国瑞
2016
16.80
第二本:大脑中的动物
海底总动员
周天昊
2018
36.80
第三本:web前端一站式开发
疯狂的web前端
王科
王石
王天一
王启强
2022
76.80
第四本:JS教程
JavaScript基础教程
李瀚文
2023
38.80
'''
01-XPath模块-选取节点
'''
from lxml import etree
# 将book.xml解析成HTML DOM模型
htmlDom = etree.parse("book.xml")
#
print(htmlDom)
# 1.获取所有的book节点
result = htmlDom.xpath("book")
# [,
# ,
# ,
# ]
print("1.所有的book节点:",result)
# 循环遍历每个节点对象
for element in result:
# 1.1 遍历节点的标签名称
print("1.1 标签名称:",element.tag)
# 1.2 遍历子节点的文本
print("1.2 标签文本:",element.text)
# 1.3 遍历子节点的属性
print("1.3 标签属性:",element.attrib)
'''2.从根节点开始'''
# []
result = htmlDom.xpath("/bookstore")
print("2.从根节点开始:",result)
'''3.获取所有book的节点 //book'''
result = htmlDom.xpath("//book")
print("3.获取所有book的节点:",result)
'''4.获取bookstore中所有book子节点 /bookstore/book'''
result = htmlDom.xpath("/bookstore/book")
print("4.获取bookstore中的book子节点:",result)
'''5.获取所有的属性 //@'''
result = htmlDom.xpath("//@category")
print("5.获取节点属性名为category的:",result)
'''
02-XPath模块-谓语
'''
from lxml import etree
# 转换
htmlDom = etree.parse("book.xml")
# 1.获取bookstore子元素的 第一个元素
result = htmlDom.xpath("/bookstore/book[1]")
print("1.获取bookstore子元素的第一个元素:",result[0].text)
# 2.获取bookstore子元素的最后一个元素
result = htmlDom.xpath("/bookstore/book[last()]")
print("2.获取bookstore子元素的最后一个元素:",result[0].text)
# 3.获取bookstore子元素的倒数第二个元素
result = htmlDom.xpath("/bookstore/book[last()-1]")
print("3.获取bookstore子元素的倒数第二个元素:",result[0].text)
# 4.获取bookstore子元素的前两个元素
result = htmlDom.xpath('/bookstore/book[position()<3]')
print("4.获取bookstore子元素的前两个元素:",result)
# 5.获取属性名为lang的title元素
result = htmlDom.xpath("//title[@lang]")
print("5.获取属性名为lang的title元素:",result)
# 6.获取属性名为lang的title元素且值为en
result = htmlDom.xpath("//title[@lang='en']")
print("6.获取属性名为lang且值为en的title元素:",result)
# 7.获取bookstore中所有的book元素且price大于35.00
result = htmlDom.xpath("/bookstore/book[price>35.00]")
print("7.获取bookstore中所有的book元素且price大于35.00:",result)
# 8.获取bookstore中所有book元素且price大于35.00的title元素
result = htmlDom.xpath("/bookstore/book[price>35.00]/title")
print("8.获取bookstore中所有book元素且price大于35.00的title元素:",result)
'''
03-XPath模块-选取未知节点
'''
from lxml import etree
htmlDom = etree.parse("book.xml")
# 1.选取bookstore元素的所有子元素
result = htmlDom.xpath("/bookstore/*")
print("1.选取bookstore元素的所有子元素:",result)
# 2.选取文档中的所有元素
result = htmlDom.xpath("//*")
print("2.选取文档中的所有元素:",result)
# 3.选取所有带有属性title的元素
result = htmlDom.xpath("//title[@*]")
print("3.选取文档中的所有title元素且带有属性的元素:",result)
print(result[0].text)
print(result[1].text)
print(result[2].text)
print(result[3].text)
'''
04-XPath模块-选取若干路径
'''
from lxml import etree
# 转换
htmlDom = etree.parse("book.xml")
# 1.选取book元素的所有title和price元素
result = htmlDom.xpath("//book/title|//book/price")
print("1.选取book元素的所有title和price元素:",result)
# 2.选取文档中所有title和price元素
result = htmlDom.xpath("//title|//price")
print("2.选取文档中所有title和price元素",result)
# 3.选取属于bookstore元素book元素的所有title元素以及文档中的所有price
result = htmlDom.xpath("/bookstore/book/title | //price")
print("3.选取属于bookstore元素book元素的所有title元素以及文档中的所有price:",result)
# "//h1|//div[@id='htmlContent']"
# result[0] result[1]
已知Html实例如下:
使用XPath语法进行定位:
'''
XPath模块-实例测试
'''
from lxml import etree
html = etree.parse("hello.html")
# 1.获取所有的li标签
result = html.xpath("//li")
print("1.获取所有的li标签:",result[0].attrib)
# 2.获取所有的li标签下的class属性
result = html.xpath("//li/@class")
print("2.获取所有的li标签下的class属性:",result)
# 3.获取li标签下href的值为link1.html
result = html.xpath("//li/a[@href='link1.html']")
print("3.获取li标签下href的值为link1.html的元素",result[0].text)
# 4.获取所有的li标签下span标签
result = html.xpath("//li//span")
print("4.获取所有的li标签下span标签:",result)