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中使用itertools模块中的组合函数的教程
Apr 13 Python
Windows下实现Python2和Python3两个版共存的方法
Jun 12 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
Python科学计算之NumPy入门教程
Jan 15 Python
python微信公众号之关键词自动回复
Jun 15 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
Oct 11 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
Dec 05 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
python3 sorted 如何实现自定义排序标准
Mar 12 Python
Python -m参数原理及使用方法解析
Aug 21 Python
Python实现对word文档添加密码去除密码的示例代码
Dec 29 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基于mcrypt的加密解密实例
2014/10/27 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
ArrayList类(增强版)
2007/04/04 Javascript
JavaScript 无符号右移运算符
2009/04/17 Javascript
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
javascript-表格排序(降序/反序)实现介绍(附图)
2013/05/30 Javascript
在jquery中的ajax方法怎样通过JSONP进行远程调用
2014/04/04 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
详解Javascript事件驱动编程
2016/01/03 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
2016/08/23 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
Python中关于字符串对象的一些基础知识
2015/04/08 Python
Python中的random()方法的使用介绍
2015/05/15 Python
单链表反转python实现代码示例
2018/02/08 Python
简单介绍python封装的基本知识
2019/08/10 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
python能否java成为主流语言吗
2020/06/22 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
干部下基层实施方案
2014/03/14 职场文书
公司董事长岗位职责
2014/06/08 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
创先争优承诺书
2015/01/20 职场文书