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中的多进程与多线程的使用
Apr 07 Python
在Python的while循环中使用else以及循环嵌套的用法
Oct 14 Python
Django权限机制实现代码详解
Feb 05 Python
python爬虫实例详解
Jun 19 Python
python采集微信公众号文章
Dec 20 Python
Python装饰器用法实例分析
Jan 14 Python
python try 异常处理(史上最全)
Mar 07 Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 Python
Django获取该数据的上一条和下一条方法
Aug 12 Python
python程序 创建多线程过程详解
Sep 23 Python
Tensorflow 多线程设置方式
Feb 06 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 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 5.5版本的array_column()函数
2014/10/24 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
PHP给源代码加密的几种方法汇总(推荐)
2018/02/06 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
php的单例模式及应用场景详解
2021/02/27 PHP
js 省地市级联选择
2010/02/07 Javascript
一个关于jqGrid使用的小例子(行按钮)
2011/11/04 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
JavaScript实现点击文字切换登录窗口的方法
2015/05/11 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
vant时间控件使用方法详解
2020/12/24 Javascript
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
python3 http提交json参数并获取返回值的方法
2018/12/19 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
2019/11/15 Python
Opencv python 图片生成视频的方法示例
2020/11/18 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
YSL圣罗兰美妆官方旗舰店:购买YSL口红
2018/04/16 全球购物
MYSQL基础面试题
2012/05/13 面试题
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
个人总结与自我评价
2015/02/14 职场文书
街道办残联2016年助残日活动总结
2016/04/01 职场文书