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读取文件常用方法实例分析
May 22 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
Mar 16 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
Python操作word常见方法示例【win32com与docx模块】
Jul 17 Python
python+logging+yaml实现日志分割
Jul 22 Python
Python的互斥锁与信号量详解
Sep 12 Python
Django REST框架创建一个简单的Api实例讲解
Nov 05 Python
Python列表list操作相关知识小结
Jan 29 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
Feb 28 Python
Python如何输出警告信息
Jul 30 Python
conda安装tensorflow和conda常用命令小结
Feb 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互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
Convert Seconds To Hours
2007/06/16 Javascript
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
一些技巧性实用js代码小结
2009/10/14 Javascript
常用的jquery模板插件——jQuery Boilerplate介绍
2014/09/23 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
2017/04/22 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
基于Vue生产环境部署详解
2017/09/15 Javascript
JS实现可视化文件上传
2018/09/08 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
vue3.0生命周期的示例代码
2020/09/24 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
从零学Python之入门(四)运算
2014/05/27 Python
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
python Opencv将图片转为字符画
2021/02/19 Python
pandas Dataframe行列读取的实例
2018/06/08 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
pygame游戏之旅 添加碰撞效果的方法
2018/11/20 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
Python random模块制作简易的四位数验证码
2020/02/01 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
美国折扣网站:jClub
2017/08/07 全球购物
法学毕业生自荐信
2013/11/13 职场文书
采购文员岗位职责
2013/11/20 职场文书
先进党支部事迹材料
2014/01/13 职场文书
施工工地安全标语
2014/06/07 职场文书
社区敬老月活动总结
2015/05/07 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
html form表单基础入门案例讲解
2021/07/15 HTML / CSS