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之玩转字符串(1)
Sep 14 Python
python中redis的安装和使用
Dec 04 Python
Python中str.format()详解
Mar 12 Python
python方向键控制上下左右代码
Jan 20 Python
python 重命名轴索引的方法
Nov 10 Python
Python Excel处理库openpyxl使用详解
May 09 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
Mar 12 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 Python
使用matlab 判断两个矩阵是否相等的实例
May 11 Python
Python sublime安装及配置过程详解
Jun 29 Python
详解Python的爬虫框架 Scrapy
Aug 03 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 cookie名使用点号(句号)会被转换
2014/10/23 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
js实现简单进度条效果
2020/03/25 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
python在windows命令行下输出彩色文字的方法
2015/03/19 Python
python中for语句简单遍历数据的方法
2015/05/07 Python
Python程序中的观察者模式结构编写示例
2016/05/27 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
Django 视图层(view)的使用
2018/11/09 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
早餐连锁店计划书
2014/01/08 职场文书
宿舍违规检讨书
2014/01/12 职场文书
2015年元旦活动总结
2014/05/09 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书