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实现命令行闹钟脚本实例
Sep 05 Python
Python序列化基础知识(json/pickle)
Oct 19 Python
对python3 一组数值的归一化处理方法详解
Jul 11 Python
python 遍历目录(包括子目录)下所有文件的实例
Jul 11 Python
pycharm 解除默认unittest模式的方法
Nov 30 Python
python实现抖音点赞功能
Apr 07 Python
python字符串查找函数的用法详解
Jul 08 Python
Django如何将URL映射到视图
Jul 29 Python
基于Django框架的权限组件rbac实例讲解
Aug 31 Python
python 实现多维数组转向量
Nov 30 Python
python 实现将小图片放到另一个较大的白色或黑色背景图片中
Dec 12 Python
解决IDEA 的 plugins 搜不到任何的插件问题
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
php 小乘法表实现代码
2009/07/16 PHP
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
php自动加载方式集合
2016/04/04 PHP
javascript Array.remove() 数组删除
2009/08/06 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
动感效果的TAB选项卡jquery 插件
2011/07/09 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
动态加载jQuery的两种方法实例分析
2015/07/17 Javascript
理解javascript对象继承
2016/04/17 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
jquery获取链接地址和跳转详解(推荐)
2017/08/15 jQuery
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
[04:17]DOTA2完美盛典,rOtk、BurNIng携手巴图演唱《倔强》
2017/11/28 DOTA
python打开网页和暂停实例
2014/09/30 Python
跟老齐学Python之for循环语句
2014/10/02 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
Flask框架实现给视图函数增加装饰器操作示例
2018/07/16 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
Python3分析处理声音数据的例子
2019/08/27 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
Html5新标签datalist实现输入框与后台数据库数据的动态匹配
2017/05/18 HTML / CSS
土木工程求职信
2014/05/29 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
运动员入场前导词
2015/07/20 职场文书