使用ElementTree进行xml解析

时间:2012-04-06 15:36:09

标签: python xml django

我编写了一个小函数,它使用ElementTree来解析xml文件,但它抛出以下错误“xml.etree.ElementTree.ParseError:not goodform((无效令牌):第1行,第0列”。请找到下面的代码

tree = ElementTree.parse(urllib2.urlopen('http://api.ean.com/ean-services/rs/hotel/v3/list?type=xml&apiKey=czztdaxrhfbusyp685ut6g6v&cid=8123&locale=en_US&city=Dallas%20&stateProvinceCode=TX&countryCode=US&minorRev=12'))

rootElem = tree.getroot()

hotel_list = rootElem.findall("HotelList")  

1 个答案:

答案 0 :(得分:6)

您使用的网站存在多个问题:

  • 您正在使用的某个网站不会尊重您作为GET arg发送的type=xml,而是您需要发送接受标头,告诉网站您接受XML,否则它会返回JSON数据

  • 网站不接受内容类型text/xml,因此您需要发送application/xml

  • 您的parse调用是正确的,在其他答案中错误地提到它应该采用数据,而parse采用文件名或文件类型对象

所以这是工作代码

import urllib2
from xml.etree import ElementTree

url = 'http://api.ean.com/ean-services/rs/hotel/v3/list?type=xml&apiKey=czztdaxrhfbusyp685ut6g6v&cid=8123&locale=en_US&city=Dallas%20&stateProvinceCode=TX&countryCode=US&minorRev=12'
request = urllib2.Request(url, headers={"Accept" : "application/xml"})
u = urllib2.urlopen(request)
tree = ElementTree.parse(u)
rootElem = tree.getroot()
hotel_list = rootElem.findall("HotelList")  
print hotel_list

输出:

[<Element 'HotelList' at 0x248cd90>]

注意我正在创建一个Request对象并传递Accept标题

顺便说一下,如果站点返回JSON,为什么你需要解析XML,解析JSON更简单,你就会得到一个现成的python对象。