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实现的简单hangman游戏实例
Jun 28 Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
Python黑帽编程 3.4 跨越VLAN详解
Sep 28 Python
详解python调度框架APScheduler使用
Mar 28 Python
Python基于matplotlib绘制栈式直方图的方法示例
Aug 09 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
Python通用函数实现数组计算的方法
Jun 13 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
序列化Python对象的方法
Aug 01 Python
Matplotlib配色之Colormap详解
Jan 05 Python
python神经网络学习 使用Keras进行简单分类
May 04 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
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
PHP页面跳转实现延时跳转的方法
2016/12/10 PHP
浅谈PHP进程管理
2019/03/08 PHP
详解阿里云视频直播PHP-SDK接入教程
2020/07/09 PHP
jquery.validate使用攻略 第三部
2010/07/01 Javascript
IE6下出现JavaScript未结束的字符串常量错误的解决方法
2010/11/21 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
python中的字典使用分享
2016/07/31 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
python正则实现计算器功能
2017/12/14 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
Python标准库json模块和pickle模块使用详解
2020/03/10 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
学期自我鉴定
2013/11/04 职场文书
实习评语
2013/12/16 职场文书
优秀民警事迹材料
2014/01/29 职场文书
青年志愿者事迹材料
2014/02/07 职场文书
教师现实表现材料
2014/02/14 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
2015年端午节国旗下演讲稿
2015/03/19 职场文书
手机销售员岗位职责
2015/04/11 职场文书
运动会100米加油稿
2015/07/21 职场文书
Oracle 死锁的检测查询及处理
2021/09/25 Oracle
总结高并发下Nginx性能如何优化
2021/11/01 Servers