我编写了一个小函数,它使用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")
答案 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对象。