《Python Cookbook(第3版)中文版》——6.3 解析简单的XML文档

6.3 解析简单的XML文档

6.3.1 问题

我们想从一个简单的XML文档中提取出数据。

6.3.2 解决方案

xml.etree.ElementTree模块可用来从简单的XML文档中提取出数据。为了说明,假设想对Planet Python(http://planet.python.org )上的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()函数替换为其他更加有趣的处理函数。

6.3.3 讨论

在许多应用中,同XML编码的数据打交道是很常见的事情。这不仅是因为XML作为一种数据交换格式在互联网中使用广泛,而且XML还是用来保存应用程序数据(例如文字处理、音乐库等)的常用格式。本节后面的讨论假设读者已经熟悉XML的基本概念。

在许多情况下,XML如果只是简单地用来保存数据,那么文档结构就是紧凑而直接的。例如,上面示例中的RSS订阅源看起来类似于如下的XML文档:

<?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。lxml采用的编程接口和ElementTree一样,因此本节中展示的示例能够以同样的方式用lxml实现。只需要将第一个导入语句修改为from lxml.etree import parse即可。lxml完全兼容于XML标准,这为我们提供了极大的好处。此外,lxml运行起来非常快速,还提供验证、XSLT以及XPath这样的功能支持。

时间: 2024-10-23 05:57:39

《Python Cookbook(第3版)中文版》——6.3 解析简单的XML文档的相关文章

DBImport v3.44 中文版发布:数据库数据互导及文档生成工具(IT人员必备)

前言: 距离上一个版本V3.3版本的文章发布,已经是1年10个月前的事了. 其实版本一直在更新,但也没什么大的功能更新,总体比较稳定,所以也不怎么写文介绍了. 至于工作上的事,之前有半年时间跑去学英语.考驾照.到健身房请私教,远离了一下代码的世界,现在又回归了. 最近上班了,新的公司需要招.NET系.产品经理,有兴趣的可以左侧扣我(我部门要人,地点广州). 另外:阿里最近收购了一家公司,也需要Java系的高手和测试人员,有兴起的也可以扣我(我朋友的部门要人,地点广州). 嗯,闲话少说,看看工具的

《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档

1.10 其他的权威文档 UNIX/Linux 系统管理技术手册(第四版) 手册页仅仅是官方文档中的很小一部分.遗憾的是,其余更大一部分的文档都散布在Web上. 1.10.1 针对系统的专门指南 大多数发行商都有自己专门的文档项目,许多发行商还出整本书那样的手册.现在,一般都能找到联机形式的手册,而不是纸质的书.文档的规模和质量则大有不同,但是大多数发行商都至少提供一份系统管理指南和一份安装指南.表1.4给出了在哪儿可以找到我们示例系统的文档. 在这其间最出众的是IBM,IBM针对系统管理的各方

Python中有没有类似于JAVA的API那样的完整的查询文档

问题描述 大家好: 小弟目前在自学Python,以前有2年的JAVA开发经验.但是在自学的过程中,对于Python已提供哪些模块以及如何查看它们(包括源代码)很困惑.有达人来指点下吗? 顺便问下,Python怎么没有像JAVA那样的完整详细的API? 问题补充zwws 写道 解决方案 你在Windows里面安装完成后,有个Module Docs的连接.启动这个,然后选择open brower,就会出现一个本地服务器为你提供模块文档.如果和JavaDoc完全一样就是JavaDoc了,这是Pytho

《Python Cookbook(第3版)中文版》——6.7 用命名空间来解析XML文档

6.7 用命名空间来解析XML文档 6.7.1 问题 我们要解析一个XML文档,但是需要使用XML命名空间来完成. 6.7.2 解决方案 考虑使用了命名空间的如下XML文档: <?xml version="1.0" encoding="utf-8"?> <top> <author>David Beazley</author> <content> <html xmlns="http://www

使用PYTHON创建XML文档_python

当用GOOGLE查的时候,内容几乎都是一样的.但是你想要的东西,一个也没有.例如,我就找不到中国人写的如何使用PYTHON来创建一个XML文件.当然,直接用文件写的方式也能够达到同样的效果,但是毕竟容易出错,而且看起来不优雅.最后,我看了很多资料,终于明白如何使用PYTHON写一个XML文件了.以下就是一个简单的例子,这个例子是已经调试通过的,大家可以放心使用. 复制代码 代码如下: import xml.dom.minidom from xml.dom.DOMImplementation im

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.2 解析XML文档

3.2 解析XML文档 要处理XML文档,就要先解析(parse)它.解析器是这样一个程序:它读入一个文件,确认这个文件具有正确的格式,然后将其分解成各种元素,使得程序员能够访问这些元素.Java库提供了两种XML解析器: 像文档对象模型(Document Object Model, DOM)解析器这样的树型解析器(tree parser),它们将读入的XML文档转换成树结构. 像XML简单API(Simple API for XML, SAX)解析器这样的流机制解析器(streaming pa

DBImport v3.5 中文版发布:数据库定时同步及文档生成工具(IT人员必备)

前言: 趁着最近的休息时间,只能多勤快些:多写代码,多更新文章. 因为一旦投入新的工作,估计博客又会恢复到一年才产几篇的状态. 对于DBImport,因为用户的意见,增加了一个亮点功能,让软件B格升为数据库时时同步工具,所以值的介绍一下. 相比上一版本的主要功能更新: 1:优化MySql的导入效率. 2:增加定时功能(B格提升到时时数据同步功能). 3:优化导出的表脚本和数据脚本. 4:从.NET 2.0 升级编绎成.NET 4.0 版本:(主要是为了支持Oracle:Oracle.Manage

DBImport v3.3 中文版发布:数据库数据互导及文档生成工具(IT人员必备)

前言: 好久没写文了, 距离上一篇文章是3个月前的事了,虽然工作很忙,主要还是缺少写作的内容和激情,所以没怎么动手. 之前有一个来月不断面试不同层次来应聘的人员,很有想写文的冲动,后来还是忍住了. 估计写了也是那种说人坏话.恨铁不成钢的情绪文,没啥营养,所以情绪过了就没想写了. 在公司除了管理上的事情之外,另外也研发了一套适用信息系统的快速开发框架,这个有机会再写写文和大伙分享了.  下面言归正文了. 背景: 关于这个DBImport工具,发布的版本不多,仅有:V1.0.V2.0.V3.0.V3

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.3.1 文档类型定义

3.3.1 文档类型定义 提供DTD的方式有多种.可以像下面这样将其纳入到XML文档中: 正如你看到的,这些规则被纳入到DOCTYPE声明中,位于由[...]限定界限的块中.文档类型必须匹配根元素的名字,比如我们例子中的conf?iguration. 在XML文档内部提供DTD不是很普遍,因为DTD会使文件长度变得很长.把DTD存储在外部会更具意义,SYSTEM声明可以用来实现这个目标.你可以指定一个包含DTD的URL,例如: 或者 警告:如果你使用的是DTD的相对URL(比如"conf?ig.