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获取指定路径下所有指定后缀文件的方法
May 26 Python
django批量导入xml数据
Oct 16 Python
如何在python中使用selenium的示例
Dec 26 Python
python验证身份证信息实例代码
May 06 Python
在python中用url_for构造URL的方法
Jul 25 Python
Pytorch 实现自定义参数层的例子
Aug 17 Python
Python中logging日志库实例详解
Feb 19 Python
Python读取VOC中的xml目标框实例
Mar 10 Python
Django多数据库配置及逆向生成model教程
Mar 28 Python
pycharm sciview的图片另存为操作
Jun 01 Python
基于Keras中Conv1D和Conv2D的区别说明
Jun 19 Python
python数字图像处理之图像自动阈值分割示例
Jun 28 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
redis 队列操作的例子(php)
2012/04/12 PHP
基于php权限分配的实现代码
2013/04/28 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
10款实用的PHP开源工具
2015/10/23 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
拖拉表格的JS函数
2008/11/20 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
JS实现文字向下滚动完整实例
2015/02/06 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
requirejs + vue 项目搭建详解
2017/06/16 Javascript
npm 下载指定版本的组件方法
2018/05/17 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
详解小程序input框失焦事件在提交事件前的处理
2019/05/05 Javascript
vue按需加载实例详解
2019/09/06 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
跟老齐学Python之私有函数和专有方法
2014/10/24 Python
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
日语系毕业生推荐信
2013/11/11 职场文书
初中物理教学反思
2014/01/14 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
老兵退伍感言
2015/08/03 职场文书
Pandas 数据编码的十种方法
2022/04/20 Python