第104天: Python 解析 XML

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 第104天: Python 解析 XML

1 简介


XML 全称 Extensible Markup Language,中文译为可扩展标记语言。XML 之前有两个先行者:SGML 和 HTML,率先登场的是 SGML, 尽管它功能强大,但文档结构复杂,既不容易学也不易于使用,因此几个主要的浏览器厂商均拒绝支持 SGML,这些因素限制了 SGML 在网上的传播性;1989 年 HTML 登场,它继承了 SGML 诸多优点,去除了 SGML 复杂庞大的缺点,HTML 在数据显示上表现十分出色,但它的语法是不可扩展的,因此其无法描述数据、可读性差,没办法人们再次将目光转向 SGML,经过对 SGML 一系列改造,终于在 1998 年,XML 第一个版本问世。


上面说了那么多,简单来说就是:XML 和 HTML 均由 SGML 改造而来,HTML 是一种页面技术,聚焦的是数据的显示,而 XML 易于扩展,主要用来传送和存储数据,聚焦的是数据的内容。


2 解析


2.1 解析方式


Python 有三种 XML 解析方式:SAX(simple API for XML)、DOM(Document Object Model)、ElementTree。


  • DOM 方式:DOM 中文译为文档对象模型,是 W3C 组织推荐的标准编程接口,它将 XML 数据在内存中解析成一个树,通过对树的操作来操作 XML。


  • SAX 方式:SAX 是一个用于处理 XML 事件驱动的模型,它逐行扫描文档,一边扫描一边解析,对于大型文档的解析拥有巨大优势,尽管不是 W3C 标准,但它却得到了广泛认可。


  • ElementTree 方式:ElementTree 相对于 DOM 来说拥有更好的性能,与 SAX 性能差不多,API 使用也很方便。


2.2 具体实现


在具体解析之前我们先准备一个 XML,如下所示:

test.xml


<?xml version="1.0" encoding="utf-8"?><list><student id="stu1" name="stu">   <id>1001</id>   <name>张三</name>   <age>22</age>   <gender>男</gender></student><student id="stu2" name="stu">   <id>1002</id>   <name>李四</name>   <age>21</age>   <gender>女</gender></student></list>


DOM 方式解析


使用 DOM 方式,首先要对其 API 有一定了解,如果不了解,网上的教程也比较多,比如:DOM 教程,下面看一下使用示例。



from xml.dom.minidom import parse
# 读取文件dom = parse('test.xml')# 获取文档元素对象data = dom.documentElement# 获取 studentstus = data.getElementsByTagName('student')for stu in stus:  # 获取标签属性值    st_id = stu.getAttribute('id')    st_name = stu.getAttribute('name') # 获取标签中内容    id = stu.getElementsByTagName('id')[0].childNodes[0].nodeValue    name = stu.getElementsByTagName('name')[0].childNodes[0].nodeValue    age = stu.getElementsByTagName('age')[0].childNodes[0].nodeValue    gender = stu.getElementsByTagName('gender')[0].childNodes[0].nodeValue    print('st_id:', st_id,  ', st_name:',st_name)    print('id:', id, ', name:', name, ', age:', age, ', gender:',gender)


输出结果:


st_id: stu1 , st_name: stuid: 1001 , name: 张三 , age: 22 , gender: 男st_id: stu2 , st_name: stuid: 1002 , name: 李四 , age: 21 , gender: 女


通过输出结果,我们可以发现已经获取了标签属性值和标签内容了。


SAX 方式解析


使用 SAX 解析 XML 文档主要涉及到解析器和事件处理器,解析器负责读取 XML 文档,并向事件处理器发送事件,事件处理器负责对事件作出响应,对传递的 XML 数据进行处理。


Python 使用 SAX 处理 XML 需要用到 xml.sax 中的 parse 函数和 xml.sax.handler 中的 ContentHandler 类,下面看一下 ContentHandler 类中的一些方法。


  • characters(content):调用时机:从行开始,遇到标签之前,存在字符,content 的值为这些字符串;从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串;从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。
  • startDocument():文档启动的时候调用。
  • endDocument():解析器到达文档结尾时调用。
  • startElement(name, attrs):遇到 XML 开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典。
  • endElement(name):遇到 XML 结束标签时调用。

下面通过示例看一下如何通过 SAX 方式解析 XML。


import xml.sax
class StudentHandler(xml.sax.ContentHandler):    def __init__(self):        self.id = ""        self.name = ""        self.age = ""        self.gender = ""
    # 元素开始调用    def startElement(self, tag, attributes):        self.CurrentData = tag        if tag == "student":            stu_name = attributes["name"]            print("stu_name:", stu_name)
    # 元素结束调用    def endElement(self, tag):        if self.CurrentData == "id":            print("id:", self.id)        elif self.CurrentData == "name":            print("name:", self.name)        elif self.CurrentData == "age":            print("age:", self.age)        elif self.CurrentData == "gender":            print("gender:", self.gender)        self.CurrentData = ""
    # 读取字符时调用    def characters(self, content):        if self.CurrentData == "id":            self.id = content        elif self.CurrentData == "name":            self.name = content        elif self.CurrentData == "age":            self.age = content        elif self.CurrentData == "gender":            self.gender = content
if (__name__ == "__main__"):    # 创建 XMLReader    parser = xml.sax.make_parser()    # 关闭命名空间    parser.setFeature(xml.sax.handler.feature_namespaces, 0)    # 重写 ContextHandler    Handler = StudentHandler()    parser.setContentHandler(Handler)    parser.parse("test.xml")


输出结果:


stu_name: stuid: 1001name: 张三age: 22gender: 男stu_name: stuid: 1002name: 李四age: 21gender: 女


ElementTree 方式解析


Python 提供了两种 ElementTree 的实现方式。一个是纯 Python 实现的 xml.etree.ElementTree,另一个是 C 语言实现 xml.etree.cElementTree,使用 C 语言实现的方式速度更快且内存消耗更少。Python3.3 之后,ElemenTree 模块会自动优先使用 C 加速器,如果不存在 C 实现,则会使用 Python 实现。因此,使用 Python3.3+ 时,只需要 import xml.etree.ElementTree 即可。下面看一下示例。


import xml.etree.ElementTree as ET
tree = ET.parse("test.xml")# 根节点root = tree.getroot()# 标签名print('root_tag:',root.tag)for stu in root:    # 属性值    print ("stu_name:", stu.attrib["name"])    # 标签中内容    print ("id:", stu[0].text)    print ("name:", stu[1].text)    print("age:", stu[2].text)    print("gender:", stu[3].text)


输出结果:



root_tag: liststu_name: stuid: 1001name: 张三age: 22gender: 男stu_name: stuid: 1002name: 李四age: 21gender: 女


总结


本文介绍和演示了 Python 三种 XML 解析方式,对 Python 工程师使用 Python 解析 XML 提供了支撑。


示例代码:https://github.com/JustDoPython/python-100-day


参考

https://baike.baidu.com/item/%E5%8F%AF%E6%89%A9%E5%B1%95%E6%A0%87%E8%AE%B0%E8%AF%AD%E8%A8%80/2885849?fromtitle=xml&fromid=86251&fr=aladdin

https://www.runoob.com/python3/python3-xml-processing.html


系列文章


第103天:Python 操作 Excel

第102天:Python aiohttp第101天:Python asyncio从 0 学习 Python 0 - 100 大合集总结

目录
相关文章
|
3天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
1天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
16 5
|
14天前
|
存储 缓存 Python
Python中的装饰器深度解析与实践
在Python的世界里,装饰器如同一位神秘的魔法师,它拥有改变函数行为的能力。本文将揭开装饰器的神秘面纱,通过直观的代码示例,引导你理解其工作原理,并掌握如何在实际项目中灵活运用这一强大的工具。从基础到进阶,我们将一起探索装饰器的魅力所在。
|
19天前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
24 7
|
20天前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href=&#39;example.com&#39;]` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
21天前
|
测试技术 开发者 Python
使用Python解析和分析源代码
本文介绍了如何使用Python的`ast`模块解析和分析Python源代码,包括安装准备、解析源代码、分析抽象语法树(AST)等步骤,展示了通过自定义`NodeVisitor`类遍历AST并提取信息的方法,为代码质量提升和自动化工具开发提供基础。
34 8
|
28天前
|
数据可视化 图形学 Python
在圆的外面画一个正方形:Python实现与技术解析
本文介绍了如何使用Python的`matplotlib`库绘制一个圆,并在其外部绘制一个正方形。通过计算正方形的边长和顶点坐标,实现了圆和正方形的精确对齐。代码示例详细展示了绘制过程,适合初学者学习和实践。
39 9
|
22天前
|
XML JSON API
如何使用Python将字典转换为XML
本文介绍了如何使用Python中的`xml.etree.ElementTree`库将字典数据结构转换为XML格式。通过定义递归函数处理字典到XML元素的转换,生成符合标准的XML文档,适用于与旧系统交互或需支持复杂文档结构的场景。示例代码展示了将一个简单字典转换为XML的具体实现过程。
16 1
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
71 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
76 0

推荐镜像

更多
下一篇
DataWorks