文档章节

Python解析XML文档

Kevin_Yang
 Kevin_Yang
发布于 2013/09/04 22:27
字数 1324
阅读 3.7K
收藏 5

解析XML主要用到pytohn自带的XML库,其次还是lxml库

XML结构,先以一个相对简单但功能比较全的XML文档为例

<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'>
  <title>dive into mark</title>
  <subtitle>currently between addictions</subtitle>
  <id>tag:diveintomark.org,2001-07-29:/</id>
  <updated>2009-03-27T21:56:07Z</updated>
  <link rel='alternate' type='text/html' href='http://diveintomark.org/'/>
  <entry>
    <author>
      <name>Mark</name>
      <uri>http://diveintomark.org/</uri>
    </author>
    <title>Dive into history, 2009 edition</title>
    <link rel='alternate' type='text/html'
      href='http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition'/>
    <id>tag:diveintomark.org,2009-03-27:/archives/20090327172042</id>
    <updated>2009-03-27T21:56:07Z</updated>
    <published>2009-03-27T17:20:42Z</published>
    <category scheme='http://diveintomark.org' term='diveintopython'/>
    <category scheme='http://diveintomark.org' term='docbook'/>
    <category scheme='http://diveintomark.org' term='html'/>
    <summary type='html'>Putting an entire chapter on one page sounds
      bloated, but consider this &amp;mdash; my longest chapter so far
      would be 75 printed pages, and it loads in under 5 seconds&amp;hellip;
      On dialup.</summary>
  </entry>
  <entry>
    <author>
      <name>Mark</name>
      <uri>http://diveintomark.org/</uri>
    </author>
    <title>Accessibility is a harsh mistress</title>
    <link rel='alternate' type='text/html'
      href='http://diveintomark.org/archives/2009/03/21/accessibility-is-a-harsh-mistress'/>
    <id>tag:diveintomark.org,2009-03-21:/archives/20090321200928</id>
    <updated>2009-03-22T01:05:37Z</updated>
    <published>2009-03-21T20:09:28Z</published>
    <category scheme='http://diveintomark.org' term='accessibility'/>
    <summary type='html'>The accessibility orthodoxy does not permit people to
      question the value of features that are rarely useful and rarely used.</summary>
  </entry>
  <entry>
    <author>
      <name>Mark</name>
    </author>
    <title>A gentle introduction to video encoding, part 1: container formats</title>
    <link rel='alternate' type='text/html'
      href='http://diveintomark.org/archives/2008/12/18/give-part-1-container-formats'/>
    <id>tag:diveintomark.org,2008-12-18:/archives/20081218155422</id>
    <updated>2009-01-11T19:39:22Z</updated>
    <published>2008-12-18T15:54:22Z</published>
    <category scheme='http://diveintomark.org' term='asf'/>
    <category scheme='http://diveintomark.org' term='avi'/>
    <category scheme='http://diveintomark.org' term='encoding'/>
    <category scheme='http://diveintomark.org' term='flv'/>
    <category scheme='http://diveintomark.org' term='GIVE'/>
    <category scheme='http://diveintomark.org' term='mp4'/>
    <category scheme='http://diveintomark.org' term='ogg'/>
    <category scheme='http://diveintomark.org' term='video'/>
    <summary type='html'>These notes will eventually become part of a
      tech talk on video encoding.</summary>
  </entry>
</feed>
先简单的看一下这个XML的结构

<feed xmlns='http://www.w3.org/2005/Atom' xml:lang='en'> #这里定义了命名空间(namespace) http://www.w3.org/2005/Atom
  <title></title>
  <subtitle></subtitle>
  <id></id>
  <updated></updated>
  <link rel='alternate' type='text/html' href='http://diveintomark.org/'/> #这里的<link>没有text,但是里面有相应的属性
  <entry>
    <author>
      <name></name>
      <uri></uri>
    </author>
    <title></title>
    <link rel='alternate' type='text/html'
      href='http://diveintomark.org/archives/2009/03/27/dive-into-history-2009-edition'/>
    <id></id>
    <updated></updated>
    <published></published>
    <category scheme='http://diveintomark.org' term='diveintopython'/>
    <summary type='html'></summary>
  </entry>
</feed>

首先有一个全局的根元素<feed></feed>

在根元素下面有title,subtitle,id,update,link,entry子元素

在entry元素下面还有author,title,link,id,updated,published,category,summary子元素 (姑且称为孙元素)

在author元素下面还有name,uri子元素(这该称为曾孙元素了吧~ 哈哈)

结构还是挺清晰的

下面我们用python的方法来一步步的取出在元素<></>这间的content以为元素内的属性

使用的方法主要有

tree = etree.parse() 解析XML

root = tree.getroot() 得到根元素

root.tag 根元素名称

root.attrib 显示元素的属性

root.findall() 查找元素

下面请看代码,都已经将注释与结果写在里面

import xml.etree.ElementTree as etree #将xml.etree.ElementTree引入
tree = etree.parse('feed.xml') #解析XML
root = tree.getroot()
print root
# <Element {http://www.w3.org/2005/Atom}feed at cd1eb0>

#元素即列表
print root.tag
#{http://www.w3.org/2005/Atom}feed
# ElementTree使用{namespace}localname来表达xml元素

for child in root:
    print child

    # <Element {http://www.w3.org/2005/Atom}title at e2b5d0>
    # <Element {http://www.w3.org/2005/Atom}subtitle at e2b4e0>
    # <Element {http://www.w3.org/2005/Atom}id at e2b6c0>
    # <Element {http://www.w3.org/2005/Atom}updated at e2b6f0>
    # <Element {http://www.w3.org/2005/Atom}link at e2b4b0>
    # <Element {http://www.w3.org/2005/Atom}entry at e2b720>
    # <Element {http://www.w3.org/2005/Atom}entry at e2b510>
    # <Element {http://www.w3.org/2005/Atom}entry at e2b750>
    # 这里只显示一级子元素,而子元素的子元素将不会被遍历

#属性即字典
print root.attrib
#{'{http://www.w3.org/XML/1998/namespace}lang': 'en'}
#我们注意到feed下面的link这个元素有属性
print root[4].attrib
#{'href': 'http://diveintomark.org/', 'type': 'text/html', 'rel': 'alternate'}
print root[3].attrib
#{} 将会得到一个空字典,因为updated元素内没有属性值

#查找元素
entrylist = root.findall('{http://www.w3.org/2005/Atom}entry')
print entrylist
# [<Element {http://www.w3.org/2005/Atom}entry at 18423a0>, <Element {http://www.w
# 3.org/2005/Atom}entry at 18425d0>, <Element {http://www.w3.org/2005/Atom}entry a
# t 1842968>]
print root.findall('{http://www.w3.org/2005/Atom}author') 
# 这里将得到一个空列表,因为author不是feed的直接子元素

#查找子元素
entries = tree.findall('{http://www.w3.org/2005/Atom}entry') #先找到entry元素·
title = entries[0].find('{http://www.w3.org/2005/Atom}title')#接着再找title元素
print title.text
#'Dive into history, 2009 edition'

all_links = tree.findall('//{http://www.w3.org/2005/Atom}link') #在元素前面加'//' 则可以在所有元素里查找包括子元素和孙元素
# [<Element {http://www.w3.org/2005/Atom}link at e181b0>,
 # <Element {http://www.w3.org/2005/Atom}link at e2b570>,
 # <Element {http://www.w3.org/2005/Atom}link at e2b480>,
 # <Element {http://www.w3.org/2005/Atom}link at e2b5a0>]

print all_links[0].attrib #将会得到这个Link的属性字典 
 # {'href': 'http://diveintomark.org/',
 # 'type': 'text/html',
 # 'rel': 'alternate'}

关于XML库解析与查找XML文档基本的方法就这些了,现在通过一个实例来学以至用下

还是回到微信的XML解析上,微信将用户的信息POST到你的服务器上,基本形式如下

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName> 
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
现在我们来通过上面介绍的方法来获得<Content>元素中的‘this is a test’字段

import xml.etree.ElementTree as etree

weixinxml = etree.parse('weixinpost.xml')
wroot = weixinxml.getroot()
print wroot.tag

for child in wroot:
    print child.tag

if wroot.find('Content') is not None:
    print wroot.find('Content').text
else:
    print 'Nothing found'

这样简单几步就可以把想要的内容取出来了

参考文章 http://woodpecker.org.cn/diveintopython3/xml.html

© 著作权归作者所有

Kevin_Yang
粉丝 261
博文 38
码字总数 50238
作品 0
通州
私信 提问
加载中

评论(3)

c
chen_3010

引用来自“Kevin_Yang”的评论

引用来自“chen_3010”的评论

你好, 你有关于对请求一个接口返回xml 处理的相关文档吗?

上面最后的例子可以扩展一下

蒽、 我都试过了, 但是当我请求一个接口返回xml 格式的数据时, 在解析返回的xml 总是给我报不支持多字节编码 错误信息 Traceback (most recent call last):
File "D:\Administrator\workspace\MyPython\src\test1.py", line 31, in <module>
gequxml = etree.parse(resp)
File "D:\Python27\lib\xml\etree\ElementTree.py", line 1182, in parse
tree.parse(source, parser)
File "D:\Python27\lib\xml\etree\ElementTree.py", line 656, in parse
parser.feed(data)
File "D:\Python27\lib\xml\etree\ElementTree.py", line 1640, in feed
self._parser.Parse(data, 0)
ValueError: multi-byte encodings are not supported
Kevin_Yang
Kevin_Yang 博主

引用来自“chen_3010”的评论

你好, 你有关于对请求一个接口返回xml 处理的相关文档吗?

上面最后的例子可以扩展一下
c
chen_3010
你好, 你有关于对请求一个接口返回xml 处理的相关文档吗?
Python_016 XML解析

XML 指可扩展标记语言(eXtensible Markup Language)。 XML 被设计用来传输和存储数据。 XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。 它也是元标记语言...

g00m
2015/02/21
53
0
156个Python网络爬虫资源,妈妈再也不用担心你找不到资源了

本列表包含Python网页抓取和数据处理相关的库。 前几天有私信小编要Python的学习资料,小编整理了一些有深度的Python教程和参考资料,从入门到高级的都有,文件已经打包好了,正在学习Pytho...

雁横
2018/05/02
0
0
解析--import--htmllib--xml

--import ConfigParser 模块------解析配置文件--------------------------------------------------------------------- test.conf内容: [first] w = 2 v: 3 c =11-3 [second] sw=4 test: ......

liapple6
2018/10/28
0
0
网络爬虫05: BesutifulSoup库详解

BeautifulSoup 1.什么是BeautifulSoup 灵活又方便的网页解析库,处理高效,支持多种解析器。利用它不用编写正则表达式即可方便地实现网页信息的提取 2.安装BeautifulSoup 3.解析库 解析器 使...

代码打碟手
2018/09/05
167
0
BeautifulSoup安装及其应用

BeautifulSoup 安装及其使用 BeautifulSoup 是个好东东。 官网见这里: http://www.crummy.com/software/BeautifulSoup/ 下载地址见这里:http://www.crummy.com/software/BeautifulSoup/bs......

Prefecter
2014/01/02
8K
0

没有更多内容

加载失败,请刷新页面

加载更多

007. J.U.C 之锁的使用

1. Lock API 1. Locks 包类层次结构 2. Lock 接口 方法签名 描述 void lock(); 获取锁(不死不休) boolean tryLock(); 获取锁(浅尝辄止) boolean tryLock(long time, TimeUnit unit) throws ......

紫穹
48分钟前
44
0
如何确定Python变量的类型? - How to determine a Python variable's type?

问题: How do I see the type of a variable whether it is unsigned 32 bit, signed 16 bit, etc.? 如何查看变量的类型,无论是无符号32位,带符号16位等等? How do I view it? 我该如何看...

javail
今天
154
0
略谈分布式系统中的容器设计模式

本文作者:zytan_cocoa 略谈分布式系统中的容器设计模式 谭中意 2020/3/5 前言:云原生(Cloud Native)不仅仅是趋势,更是现在进行时,它是构建现代的,可弹性伸缩的,快速迭代的计算网络服...

百度开发者中心
03/11
158
0
a small thing that made me a little bit depressed

It was just two hours ago,specificly speaking It was 11:48 almost coming close to midneight. I was pratising singing songs in my renting room which is a sharing apartment . I re......

lost_myself
今天
142
0
OSChina 周日乱弹 —— 这中间几个月的地震、核爆、外星人、高达... 去哪了

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《Elizabeth》- Ashram 手机党少年们想听歌,请使劲儿戳(这里) @巴拉迪维 :#共...

小小编辑
今天
265
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部