Python 解析简单的XML数据


Posted in Python onJuly 24, 2020

问题

你想从一个简单的XML文档中提取数据。

解决方案

可以使用 xml.etree.ElementTree 模块从简单的XML文档中提取数据。为了演示,假设你想解析Planet Python上的RSS源。下面是相应的代码:

from urllib.request import urlopen
from xml.etree.ElementTree import parse

# Download the RSS feed and parse it
u = urlopen('http://planet.python.org/rss20.xml')
doc = parse(u)

# Extract and output tags of interest
for item in doc.iterfind('channel/item'):
  title = item.findtext('title')
  date = item.findtext('pubDate')
  link = item.findtext('link')

  print(title)
  print(date)
  print(link)
  print()

运行上面的代码,输出结果类似这样:

Steve Holden: Python for Data Analysis
Mon, 19 Nov 2012 02:13:51 +0000
http://holdenweb.blogspot.com/2012/11/python-for-data-analysis.html

Vasudev Ram: The Python Data model (for v2 and v3)
Sun, 18 Nov 2012 22:06:47 +0000
http://jugad2.blogspot.com/2012/11/the-python-data-model.html

Python Diary: Been playing around with Object Databases
Sun, 18 Nov 2012 20:40:29 +0000
http://www.pythondiary.com/blog/Nov.18,2012/been-...-object-databases.html

Vasudev Ram: Wakari, Scientific Python in the cloud
Sun, 18 Nov 2012 20:19:41 +0000
http://jugad2.blogspot.com/2012/11/wakari-scientific-python-in-cloud.html

Jesse Jiryu Davis: Toro: synchronization primitives for Tornado coroutines
Sun, 18 Nov 2012 20:17:49 +0000
http://feedproxy.google.com/~r/EmptysquarePython/~3/_DOZT2Kd0hQ/

很显然,如果你想做进一步的处理,你需要替换 print() 语句来完成其他有趣的事。

讨论

在很多应用程序中处理XML编码格式的数据是很常见的。不仅是因为XML在Internet上面已经被广泛应用于数据交换,同时它也是一种存储应用程序数据的常用格式(比如字处理,音乐库等)。接下来的讨论会先假定读者已经对XML基础比较熟悉了。

在很多情况下,当使用XML来仅仅存储数据的时候,对应的文档结构非常紧凑并且直观。例如,上面例子中的RSS订阅源类似于下面的格式:

<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Planet Python</title>
    <link>http://planet.python.org/</link>
    <language>en</language>
    <description>Planet Python - http://planet.python.org/</description>
    <item>
      <title>Steve Holden: Python for Data Analysis</title>
      <guid>http://holdenweb.blogspot.com/...-data-analysis.html</guid>
      <link>http://holdenweb.blogspot.com/...-data-analysis.html</link>
      <description>...</description>
      <pubDate>Mon, 19 Nov 2012 02:13:51 +0000</pubDate>
    </item>
    <item>
      <title>Vasudev Ram: The Python Data model (for v2 and v3)</title>
      <guid>http://jugad2.blogspot.com/...-data-model.html</guid>
      <link>http://jugad2.blogspot.com/...-data-model.html</link>
      <description>...</description>
      <pubDate>Sun, 18 Nov 2012 22:06:47 +0000</pubDate>
    </item>
    <item>
      <title>Python Diary: Been playing around with Object Databases</title>
      <guid>http://www.pythondiary.com/...-object-databases.html</guid>
      <link>http://www.pythondiary.com/...-object-databases.html</link>
      <description>...</description>
      <pubDate>Sun, 18 Nov 2012 20:40:29 +0000</pubDate>
    </item>
    ...
  </channel>
</rss>

xml.etree.ElementTree.parse() 函数解析整个XML文档并将其转换成一个文档对象。 然后,你就能使用 find() 、iterfind() 和 findtext() 等方法来搜索特定的XML元素了。 这些函数的参数就是某个指定的标签名,例如 channel/item 或 title 。 每次指定某个标签时,你需要遍历整个文档结构。每次搜索操作会从一个起始元素开始进行。 同样,每次操作所指定的标签名也是起始元素的相对路径。 例如,执行 doc.iterfind('channel/item') 来搜索所有在 channel 元素下面的 item 元素。 doc 代表文档的最顶层(也就是第一级的 rss 元素)。 然后接下来的调用 item.findtext() 会从已找到的 item 元素位置开始搜索。 ElementTree 模块中的每个元素有一些重要的属性和方法,在解析的时候非常有用。 tag 属性包含了标签的名字,text 属性包含了内部的文本,而 get() 方法能获取属性值。例如:

>>> doc
<xml.etree.ElementTree.ElementTree object at 0x101339510>
>>> e = doc.find('channel/title')
>>> e
<Element 'title' at 0x10135b310>
>>> e.tag
'title'
>>> e.text
'Planet Python'
>>> e.get('some_attribute')
>>>

有一点要强调的是 xml.etree.ElementTree 并不是XML解析的唯一方法。对于更高级的应用程序,你需要考虑使用 lxml 。它使用了和ElementTree同样的编程接口,因此上面的例子同样也适用于lxml。你只需要将刚开始的import语句换成 from lxml.etree import parse 就行了。lxml 完全遵循XML标准,并且速度也非常快,同时还支持验证,XSLT和XPath等特性。

以上就是Python 解析简单的XML数据的详细内容,更多关于Python 解析XML的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python使用matplotlib绘制动画的方法
May 20 Python
Python提取网页中超链接的方法
Sep 18 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
教你用Python创建微信聊天机器人
Mar 31 Python
Python中的上下文管理器和with语句的使用
Apr 17 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
Python实现计算圆周率π的值到任意位的方法示例
May 08 Python
python返回数组的索引实例
Nov 28 Python
Python正则表达式急速入门(小结)
Dec 16 Python
python查看矩阵的行列号以及维数方式
May 22 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
深入了解NumPy 高级索引
Jul 24 #Python
python实现学生管理系统开发
Jul 24 #Python
浅析Python 多行匹配模式
Jul 24 #Python
Python图像处理二值化方法实例汇总
Jul 24 #Python
Python如何合并多个字典或映射
Jul 24 #Python
Matplotlib 绘制饼图解决文字重叠的方法
Jul 24 #Python
Python3.7安装pyaudio教程解析
Jul 24 #Python
You might like
用PHP连接MySQL代码的参数说明
2008/06/07 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
php实现留言板功能(代码详解)
2017/03/28 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
jquery 模拟类搜索框自动完成搜索提示功能(改进)
2010/05/24 Javascript
js中有关IE版本检测
2012/01/04 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
JS图片放大效果简单实现代码
2016/09/08 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
深入解析nodejs HTTP服务
2017/07/25 NodeJs
详解vue项目首页加载速度优化
2017/10/18 Javascript
详解angular如何调用HTML字符串的方法
2018/06/30 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
Python实现的rsa加密算法详解
2018/01/24 Python
从django的中间件直接返回请求的方法
2018/05/30 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
pywinauto自动化操作记事本
2019/08/26 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
python的faker库用法
2019/11/28 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
基于python实现音乐播放器代码实例
2020/07/01 Python
伦敦最著名的老字号百货公司:Selfridges(塞尔福里奇百货)
2016/07/25 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
幼儿园大班新学期寄语
2014/01/18 职场文书
新学期校长寄语
2014/01/18 职场文书
大学生军训广播稿
2014/01/24 职场文书
日语专业毕业生自荐书
2014/06/18 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
党员心得体会范文2016
2016/01/23 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python
Python find()、rfind()方法及作用
2022/12/24 Python