如何解析用ElementTree收缩web xml
我正尝试使用缩小网站缩略图的Web服务。他们有一个API返回XML,告诉你是否可以创建站点缩略图。我正在尝试使用ElementTree解析xml,但不知道如何获取我需要的信息。这里是一个XML响应的例子:如何解析用ElementTree收缩web xml
<?xml version="1.0" encoding="UTF-8"?>
<stw:ThumbnailResponse xmlns:stw="http://www.shrinktheweb.com/doc/stwresponse.xsd">
<stw:Response>
<stw:ThumbnailResult>
<stw:Thumbnail Exists="false"></stw:Thumbnail>
<stw:Thumbnail Verified="false">fix_and_retry</stw:Thumbnail>
</stw:ThumbnailResult>
<stw:ResponseStatus>
<stw:StatusCode>Blank Detected</stw:StatusCode>
</stw:ResponseStatus>
<stw:ResponseTimestamp>
<stw:StatusCode></stw:StatusCode>
</stw:ResponseTimestamp>
<stw:ResponseCode>
<stw:StatusCode></stw:StatusCode>
</stw:ResponseCode>
<stw:CategoryCode>
<stw:StatusCode>none</stw:StatusCode>
</stw:CategoryCode>
<stw:Quota_Remaining>
<stw:StatusCode>1</stw:StatusCode>
</stw:Quota_Remaining>
</stw:Response>
</stw:ThumbnailResponse>
我需要得到“stw:StatusCode”。如果我尝试查找“stw:StatusCode”,则会出现“期望的路径分隔符”语法错误。有没有办法获得状态码?
哎呀命名空间....试试这个:
STW_PREFIX = "{http://www.shrinktheweb.com/doc/stwresponse.xsd}"
(见示例XML的2号线)
然后,当你想要一个像stw:StatusCode
标签,使用STW_PREFIX + "StatusCode"
更新:该XML响应不是最出色的设计。从单个例子中不可能猜测是否可以有超过1个二级节点。请注意,每个第三级节点都有一个“StatusCode”子节点。下面是一些粗略和准备好的代码,它向您显示(1)为什么您需要STW_PREFIX caper(2)可用信息的摘录。
import xml.etree.cElementTree as et
def showtag(elem):
return repr(elem.tag.rsplit("}")[1])
def showtext(elem):
return None if elem.text is None else repr(elem.text.strip())
root = et.fromstring(xml_response) # xml_response is your input string
print repr(root.tag) # see exactly what tag is in the element
for child in root[0]:
print showtag(child), showtext(child)
for gc in child:
print "...", showtag(gc), showtext(gc), gc.attrib
结果:
'{http://www.shrinktheweb.com/doc/stwresponse.xsd}ThumbnailResponse'
'ThumbnailResult' ''
... 'Thumbnail' None {'Exists': 'false'}
... 'Thumbnail' 'fix_and_retry' {'Verified': 'false'}
'ResponseStatus' ''
... 'StatusCode' 'Blank Detected' {}
'ResponseTimestamp' ''
... 'StatusCode' None {}
'ResponseCode' ''
... 'StatusCode' None {}
'CategoryCode' ''
... 'StatusCode' 'none' {}
'Quota_Remaining' ''
... 'StatusCode' '1' {}
在Python 2.7+,您可以使用register_namespace(HTTP它可以帮助://docs.python。 org/library/xml.etree.elementtree.html#xml.etree.ElementTree.register_namespace)来简化调用命名空间前缀的语法。 – 2011-03-30 02:43:57
@Liza Daly:文档提到了序列化。它如何帮助解析现有的XML文档? – 2011-03-30 05:29:16
如果你表明你正在使用的代码... – 2011-03-30 01:45:40