Python 从 XML 数据中获取 ID
我刚开始学Python,想要解析一个从谷歌那边通过POST请求返回的XML文档。
返回的文档看起来像这个文档里描述的那样,具体内容可以查看这个链接:http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#Archives,里面提到“响应包含关于归档的信息”。
我最关心的就是文档开头附近的Id属性。这个文档里只会有一个条目和一个Id属性。我该怎么提取这个Id,以便后续使用呢?我已经尝试了很久,试过从minidom到elementtree的各种方法,但无论我怎么做,搜索结果总是空白,循环也没有执行,或者方法找不到。非常感谢任何帮助。谢谢!
3 个回答
0
如果你想使用minidom,可以按照下面的方式操作(把gd.xml换成你的xml文件名):
from xml.dom import minidom
dom = minidom.parse("gd.xml")
id = dom.getElementsByTagName("id")[0].childNodes[0].nodeValue
print id
另外,我猜你是想说id元素,而不是id属性。
1
假设变量 response
里存的是返回的HTML文档的字符串表示,我来告诉你一个错误的解决方法。
id = response.split("</id>")[0].split("<id>")[1]
正确的做法是使用 xml.sax
、xml.dom
或者 expat
,不过我个人觉得,除非你想要处理一些意外情况的错误,否则没必要太在意这些。
补充一下:我忘了提到 BeautifulSoup,它确实像Travis所说的那样很棒。
2
我非常推荐一个叫做 BeautifulSoup 的Python库。它真的很棒!下面是一个简单的例子,使用的是他们提供的示例数据(假设你已经安装了BeautifulSoup):
from BeautifulSoup import BeautifulSoup
data = """<?xml version='1.0' encoding='utf-8'?>
<entry xmlns='http://www.w3.org/2005/Atom'
xmlns:docs='http://schemas.google.com/docs/2007'
xmlns:gd='http://schemas.google.com/g/2005'>
<id>
https://docs.google.com/feeds/archive/-228SJEnnmwemsiDLLxmGeGygWrvW1tMZHHg6ARCy3Uj3SMH1GHlJ2scb8BcHSDDDUosQAocwBQOAKHOq3-0gmKA</id>
<published>2010-11-18T18:34:06.981Z</published>
<updated>2010-11-18T18:34:07.763Z</updated>
<app:edited xmlns:app='http://www.w3.org/2007/app'>
2010-11-18T18:34:07.763Z</app:edited>
<category scheme='http://schemas.google.com/g/2005#kind'
term='http://schemas.google.com/docs/2007#archive'
label='archive' />
<title>Document Archive - someuser@somedomain.com</title>
<link rel='self' type='application/atom+xml'
href='https://docs.google.com/feeds/default/private/archive/-228SJEnnmwemsiDLLxmGeGygWrvW1tMZHHg6ARCy3Uj3SMH1GHlJ2scb8BcHSDDDUosQAocwBQOAKHOq3-0gmKA' />
<link rel='edit' type='application/atom+xml'
href='https://docs.google.com/feeds/default/private/archive/-228SJEnnmwemsiDLLxmGeGygWrvW1tMZHHg6ARCy3Uj3SMH1GHlJ2scb8BcHSDDDUosQAocwBQOAKHOq3-0gmKA' />
<author>
<name>someuser</name>
<email>someuser@somedomain.com</email>
</author>
<docs:archiveNotify>someuser@somedomain.com</docs:archiveNotify>
<docs:archiveStatus>flattening</docs:archiveStatus>
<docs:archiveResourceId>
0Adj-hQNOVsTFSNDEkdk2221OTJfMWpxOGI5OWZu</docs:archiveResourceId>
<docs:archiveResourceId>
0Adj-hQNOVsTFZGZodGs2O72NFMllMQDN3a2Rq</docs:archiveResourceId>
<docs:archiveConversion source='application/vnd.google-apps.document'
target='text/plain' />
</entry>"""
soup = BeautifulSoup(data, fromEncoding='utf8')
print soup('id')[0].text
还有一个叫做 expat 的库,它是Python自带的,但我觉得学习BeautifulSoup更值得,因为它在处理真实的XML和HTML时表现得更好。