Python和ElementTree:write()不是';t工作不正常

Python和ElementTree:write()不是';t工作不正常,python,elementtree,Python,Elementtree,第一个问题。如果我搞砸了,让我知道 好的,我需要做的是以下几点。我正在尝试使用Python从API获取一些数据。API以XML的形式发送给我。我正在尝试使用ElementTree来解析它 现在,每次我从API请求信息时,它都是不同的。我想建立一个我得到的所有数据的列表。我可以使用Python的列表,但既然我想在最后将其保存到一个文件中,我想——为什么不使用ElementTree呢 从一个元素开始,我们称它为ListE。调用API,解析XML,从ElementTree获取根元素。将根元素作为子元素

第一个问题。如果我搞砸了,让我知道

好的,我需要做的是以下几点。我正在尝试使用Python从API获取一些数据。API以XML的形式发送给我。我正在尝试使用ElementTree来解析它

现在,每次我从API请求信息时,它都是不同的。我想建立一个我得到的所有数据的列表。我可以使用Python的列表,但既然我想在最后将其保存到一个文件中,我想——为什么不使用ElementTree呢

从一个元素开始,我们称它为ListE。调用API,解析XML,从ElementTree获取根元素。将根元素作为子元素添加到列表中。再次调用API,然后从头开始。最后,ListE应该是一个元素,其子元素是每个API调用的结果。最后,只需将ListE包装到ElementTree中,即可使用ElementTree write()函数。下面是代码

import xml.etree.ElementTree as ET

url = "http://http://api.intrade.com/jsp/XML/MarketData/ContractBookXML.jsp?id=769355"

try:
    returnurl=urlopen(url)
except IOError:
    exit()

tree = ET.parse(returnurl)
root = tree.getroot()

print "root tag and attrib: ",root.tag, root.attrib

historyE = ET.Element('historical data')
historyE.append(root)
historyE.append(root)

historyET = ET.ElementTree(historyE)
historyET.write('output.xml',"UTF-8")
程序不会返回任何错误。问题是当我要求浏览器打开它时,它声称有语法错误。用记事本打开文件我发现:

<?xml version='1.0' encoding='UTF-8'?>
<historical data><ContractBookInfo lastUpdateTime="0">
   <contractInfo conID="769355" expiryPrice="100.0" expiryTime="1357334563000" state="S" vol="712" />
</ContractBookInfo><ContractBookInfo lastUpdateTime="0">
   <contractInfo conID="769355" expiryPrice="100.0" expiryTime="1357334563000" state="S" vol="712" />
</ContractBookInfo></historical data>

我认为语法错误的原因是“历史数据”和“ContractBookInfo lastUpdateTime=“0”之间没有空格或返回。建议?

问题在于:

historyE = ET.Element('historical data')
你不应该使用空格。总结如下:

元素标记区分大小写;开始和结束标记必须是 完全匹配。标记名不能包含任何字符 !“#$%&'()*+,/;?@[]^`{124;}~,也不是空格字符,并且不能开始 使用-、、或数字


有关详细信息,请参见XML规范的第1部分(“名称中几乎所有字符都是允许的,除了那些可以或可以合理地用作分隔符的字符。”)

您能提供URL吗?我编辑了这篇文章以包含URL。但我认为这与此无关。我认为这是因为我跳过了全部内容。”将元素添加到另一个元素,然后包装“thing”,并尝试按原样写入()我从url获得的内容[也就是说,只需执行tree.write()]这很好。所以问题在于将每个元素添加到元素列表中,或者在包装中。真的!谢谢你,好心的先生。我永远不会解决它。我如何检查这个问题是否已解决?