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 04 Python
Python实现全角半角字符互转的方法
Nov 28 Python
python使用itchat实现手机控制电脑
Feb 22 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
详解pandas的外部数据导入与常用方法
May 01 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
python程序需要编译吗
Jun 19 Python
python判断是空的实例分享
Jul 06 Python
python实现图像随机裁剪的示例代码
Dec 10 Python
python中delattr删除对象方法的代码分析
Dec 15 Python
python实现黄金分割法的示例代码
Apr 28 Python
python迷宫问题深度优先遍历实例
Jun 20 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 手机归属地查询 api
2010/02/08 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
element-ui 上传图片后清空图片显示的实例
2018/09/04 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
python文本数据相似度的度量
2018/03/12 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
Python3常用内置方法代码实例
2019/11/18 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
关于python中remove的一些坑小结
2021/01/04 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
墨西哥网上超市:Superama
2018/07/10 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
促销活动总结报告
2014/04/26 职场文书
小露珠教学反思
2014/04/30 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
开幕式邀请函
2015/01/31 职场文书
医院消毒隔离制度
2015/08/05 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
详解Vue3使用axios的配置教程
2022/04/29 Vue.js
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript