XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
⭐平台兼容性: 由于XPath是标准化的工具,因此它们在不同的编程语言和操作系统中都可以使用。这意味着您可以在各种环境中应用这些技能。
自动化任务: XPath可以用于自动化任务,例如在网站上查找和更新特定信息,或者从不同来源的XML数据中自动提取和汇总信息。这可以节省大量时间和人力成本。
强大的数据提取: XPat提供了一种强大而灵活的方法,用于从XML和HTML等结构化数据中提取所需信息。无论是从网页抓取数据还是处理XML文件,它们都是不可或缺的工具。
XML和HTML处理: 在处理XML和HTML文档时,XPath是Python中最流行的工具之一。它能够有效地解析这些文档,使您能够轻松地访问和操作其中的元素和属性。
♻数据清洗和转换: 在数据预处理阶段,XPath可用于清洗和转换数据。您可以轻松地过滤、排序、分组和格式化数据,以满足您的需求,使数据变得更容易分析和理解。
由于XPath属于lxml库模块,所以首先要安装库lxml。
pip install lxml # 下载lxml库 from lxml import etree selector=etree.HTML(源码) #将源码转化为能被XPath匹配的格式 selector.xpath(表达式) #返回为一列表
html_doc = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
这是 爱丽丝梦游仙境 的一段内容(以后内容中简称为 爱丽丝 的文档)
声明:在学习以下内容时,先进行选择器的生成
selector = etree.HTML(html_doc)
表达式 | 描述 | 实例 | 解析 |
---|---|---|---|
/ | 从根节点选取 | /body/div[1] |
选取根结点下的body下的第一个div标签 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 | //a |
选取文档中所有的a标签 |
./ | 当前节点再次进行xpath | ./a |
选取当前节点下的所有a标签 |
@ | 选取属性 | //@calss |
选取所有的class属性 |
示例:
# /
print(selector.xpath('/html/body')) # []
# //
print(selector.xpath('//body')) # []
# ./
select_body = selector.xpath('//body')[0]
print(select_body.xpath('./p')) # [, , ]
# @
print(selector.xpath('//@class')) # ['title', 'story', 'sister', 'sister', 'sister', 'story']
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在 方括号 中。
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
路径表达式 | 结果 |
---|---|
/ul/li[1] | 选取属于 ul子元素的第一个 li元素。 |
/ul/li[last()] | 选取属于 ul子元素的最后一个 li元素。 |
/ul/li[last()-1] | 选取属于 ul子元素的倒数第二个 li元素。 |
//ul/li[position()❤️] | 选取最前面的两个属于 ul元素的子元素的 li元素。 |
//a[@title] | 选取所有拥有名为 title的属性的 a元素。 |
//a[@title=‘xx’] | 选取所有 a元素,且这些元素拥有值为 xx的 title属性。 |
//a[@title>10] > < >= <= != |
选取 a元素的所有 title元素,且其中的 title元素的值须大于 10。 |
/body/div[@price>35.00] | 选取body下price元素值大于35的div节点 |
示例:
# Attr
//a[@attr] # 查找属性
//a[@attr="xx"] #查找属性和值
//a[@id] # 查找含有id属性的a标签
//a[@id='link2'] # 查找id=link2的a标签
# 逻辑运算
//a[@id="link2" and @class="sister"] # 查找a元素、条件:id=link2 并且 class=sister
//a[@id='link2' or @class='sister']# 查找a元素、条件:id=link2 或者 class=sister
# ❗值得注意的是:虽然是在字符串内写路径表达式,但是属性值依然需要用引号进行包裹
XPath 通配符可用来选取未知的 XML 元素。
通配符 | 描述 |
---|---|
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
实例:
路径表达式 | 结果 |
---|---|
/ul/* | 选取ul 元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带有属性的 title 元素。 |
//node() | 获取所有节点 |
通过在路径表达式中使用“|”运算符,您可以选取若干个路径。
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
//ol/li| //ul/li | 选取 ul、ol元素的所有 li 元素。 |
//ol| //ul | 选取文档中的所有 ol和 ul元素。 |
//a[contains(@id, "link")] # 查询所有id属性中包含link的a标签
//a[starts-with(@id, "li")] # 查询所有id属性中包以li开头的a标签
//a/text() # 查找所有a标签下的内容
//a/@href # 获取a里面的href属性值
//* #获取所有
//*[@class="xx"] #获取所有class为xx的标签
# 获取节点内容转换成字符串
text = selector.xpath('//p[2]/a')[0]
result = etree.tostring(text, encoding='utf-8')
print(result.decode('UTF-8'))
页面获取地址:豆瓣电影TOP250
本篇文章只为讲述
XPath
的应用,案例比较简单,仅用于巩固XPath
的使用,所以取页面的时候就直接选择简单粗暴地方法,打开页面后右键 查看网页源代码 ,直接复制存储到本地
from lxml import etree
with open('html/douban.html', mode='r', encoding='utf-8') as f:
selector = etree.HTML(f.read())
ol = selector.xpath('//ol[@class="grid_view"]')[0] # 获取到电影数据最外层的标签
# print(ol)
item_list = ol.xpath('.//div[@class="item"]') # 获取每个电影信息外层信息
for item in item_list:
# print('⭕',item)
print(item.xpath('.//span[@class="title"]/text()')[0]) # 获取电影名称
print(item.xpath('.//span[@class="rating_num"]/text()')[0])# 获取电影评分
# ...更多感兴趣的可以自己尝试呦
本编文章仅展示XPath
部分功能,更强大、更有意思的使用方法可详看文档:XPath教程
如果您有任何问题、建议或反馈,欢迎在评论区留言,非常愿意听取您的声音。感谢您的阅读,期待与您在未来的博客分享中再次相会!