第一个问题。如果我搞砸了,请告诉我。
好的,我需要做的是以下内容。我正在尝试使用Python从API获取一些数据。 API以XML格式将其发送给我。我正在尝试使用ElementTree来解析它。
现在,每次我从API请求信息时,都会有所不同。我想构建一个我得到的所有数据的列表。我可以使用Python的列表,但由于我想将它保存到文件末尾,我想 - 为什么不使用ElementTree呢。
从Element开始,我们称之为ListE。调用API,解析XML,从ElementTree获取根元素。将根元素作为子元素添加到ListE中。再次调用API,并全部完成。最后,ListE应该是一个Element,其子元素是每个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”'之间没有空格或回报。建议?
答案 0 :(得分:3)
问题在于:
historyE = ET.Element('historical data')
你不应该使用空格。如Wikipedia所述:
元素标签区分大小写;开头和结尾标签必须 完全匹配。标记名称不能包含任何字符 !“#$%&amp;'()* +,/;&lt; =&gt;?@ [] ^`{|}〜,也不是空格字符,无法启动 用 - ,.或数字数字。
有关详细信息,请参阅XML规范的this section(“名称中允许使用几乎所有字符,除非那些字符可以或者可以合理地用作分隔符。”)