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案例代码:
<?xml version="1.0" encoding="utf-8" ?>
<!--存储书店书籍列表-->
<bookstore>
<book category="cooking">
第一本:舌尖上的中国
<title lang="en">美味生活</title>
<author>李国瑞</author>
<year>2016</year>
<price>16.80</price>
</book>
<book category="children" lang="en">
第二本:大脑中的动物
<title lang="en">海底总动员</title>
<author>周天昊</author>
<year>2018</year>
<price>36.80</price>
</book>
<book category="web">
第三本:web前端一站式开发
<title lang="en">疯狂的web前端</title>
<author>王科</author>
<author>王石</author>
<author>王天一</author>
<author>王启强</author>
<year>2022</year>
<price>76.80</price>
</book>
<book category="web" cover="paperback">
第四本:JS教程
<title lang="en">JavaScript基础教程</title>
<author>李瀚文</author>
<year>2023</year>
<price>38.80</price>
</book>
</bookstore>
1.选取节点
'''
01-XPath模块-选取节点
'''
from lxml import etree
# 将book.xml解析成HTML DOM模型
htmlDom = etree.parse("book.xml")
# <lxml.etree._ElementTree object at 0x000001BD24F422C0>
print(htmlDom)
# 1.获取所有的book节点
result = htmlDom.xpath("book")
# [<Element book at 0x21b07832c00>,
# <Element book at 0x21b07832e00>,
# <Element book at 0x21b07832f00>,
# <Element book at 0x21b07832ec0>]
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.从根节点开始'''
# [<Element bookstore at 0x243e8a72340>]
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)
2.谓语
'''
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)
3. 选取未知节点
'''
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)
4. 选取若干路径
'''
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]
5. 使用XPath定位Html简单实例
已知Html实例如下:
<div>
<ul>
<li class="item-0">
<a href="link1.html">first item</a>
</li>
<li class="item-1">
<a href="link2.html">second item</a>
</li>
<li class="zpp-item">
<a href="link3.html">third item</a>
</li>
<li class="item-1">
<a href="link4.html">fourth item</a>
</li>
<li class="item-0">
<a href="link5.html">fifth item</a>
<span>很棒棒哦!</span>
</li>
</ul>
</div>
使用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)