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 相关文章推荐
Python3中使用PyMongo的方法详解
Jul 28 Python
Python机器学习logistic回归代码解析
Jan 17 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
在Python中输入一个以空格为间隔的数组方法
Nov 13 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
PyCharm 设置SciView工具窗口的方法
Jan 15 Python
python交互界面的退出方法
Feb 16 Python
python分布式计算dispy的使用详解
Dec 22 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
python利用paramiko实现交换机巡检的示例
Sep 22 Python
Python 数据可视化之Bokeh详解
Nov 02 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高级编程-函数-郑阿奇
2011/07/04 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
jquery取消事件冒泡的三种方法(推荐)
2016/05/28 Javascript
javascript jquery对form元素的常见操作详解
2016/06/12 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
浅谈express 中间件机制及实现原理
2017/08/31 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
vue 解决异步数据更新问题
2019/10/29 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
python+mongodb数据抓取详细介绍
2017/10/25 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
查看django版本的方法分享
2018/05/14 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
python3 常见解密加密算法实例分析【base64、MD5等】
2019/12/19 Python
python实现串口通信的示例代码
2020/02/10 Python
在python中求分布函数相关的包实例
2020/04/15 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
化学相关工作求职信
2013/10/02 职场文书
小小商店教学反思
2014/04/27 职场文书
工作表扬信
2015/01/17 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python
解析mybatis-plus中的resultMap简单使用
2021/11/23 Java/Android