深入学习XPath:解析和提取XML数据的强大工具

1️⃣ 简介

🔴 什么是XPath

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

🟠 XPath的优点和用途

⭐平台兼容性: 由于XPath是标准化的工具,因此它们在不同的编程语言和操作系统中都可以使用。这意味着您可以在各种环境中应用这些技能。
🕋自动化任务: XPath可以用于自动化任务,例如在网站上查找和更新特定信息,或者从不同来源的XML数据中自动提取和汇总信息。这可以节省大量时间和人力成本。
💪强大的数据提取: XPat提供了一种强大而灵活的方法,用于从XML和HTML等结构化数据中提取所需信息。无论是从网页抓取数据还是处理XML文件,它们都是不可或缺的工具。
💻XML和HTML处理: 在处理XML和HTML文档时,XPath是Python中最流行的工具之一。它能够有效地解析这些文档,使您能够轻松地访问和操作其中的元素和属性。
♻数据清洗和转换: 在数据预处理阶段,XPath可用于清洗和转换数据。您可以轻松地过滤、排序、分组和格式化数据,以满足您的需求,使数据变得更容易分析和理解。

🟡 XPath在Python中的使用

由于XPath属于lxml库模块,所以首先要安装库lxml。

pip install lxml # 下载lxml库

from lxml import etree
selector=etree.HTML(源码) #将源码转化为能被XPath匹配的格式
selector.xpath(表达式) #返回为一列表

2️⃣ 使用

❗❗ 以下示例中皆用下面的HTML代码

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

这是 爱丽丝梦游仙境 的一段内容(以后内容中简称为 爱丽丝 的文档)

🔰声明:在学习以下内容时,先进行选择器的生成

selector = etree.HTML(html_doc)

💠 路径表达式

表达式描述实例解析
/从根节点选取/body/div[1]选取根结点下的body下的第一个div标签
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置//a选取文档中所有的a标签
./当前节点再次进行xpath./a选取当前节点下的所有a标签
@选取属性//@calss选取所有的class属性

🧿示例:

# / 
print(selector.xpath('/html/body')) # [<Element body at 0x1a45cc599c0>]

# //
print(selector.xpath('//body')) # [<Element body at 0x1a45cc599c0>]

# ./
select_body = selector.xpath('//body')[0]
print(select_body.xpath('./p')) # [<Element p at 0x2339d2b8840>, <Element p at 0x2339d5e6000>, <Element p at 0x2339d5e6080>]

# @
print(selector.xpath('//@class')) # ['title', 'story', 'sister', 'sister', 'sister', 'story']

🔷 谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在 方括号 中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式结果
/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'))

3️⃣ 网页数据提取示例

页面获取地址:豆瓣电影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])# 获取电影评分
        # ...更多感兴趣的可以自己尝试呦😋

4️⃣ 写在最后

本编文章仅展示XPath部分功能,更强大、更有意思的使用方法可详看文档:XPath教程

如果您有任何问题、建议或反馈,欢迎在评论区留言📝,非常愿意听取您的声音。感谢您的阅读,期待与您在未来的博客分享中再次相会🥳!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端奇遇记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值