【发布时间】:2020-04-07 15:59:39
【问题描述】:
我的程序如下。 当用 et 解析一个超过 2 个子节点的 xml 文件时,当我在第一个子节点中收集数据时,它会按预期工作,但是当我在第二个子节点中时,它会获取第一个子节点的数据。但是当 xml 只有 1 个孩子时,它会按预期工作。
这是我正在解析的只有 1 个孩子的 xml 文件
<exec_api version="2.0" method="marketstat_xml">
<marketstat>
<type id="215">
<buy>
<volume>161730411</volume>
<avg>1.91</avg>
<stddev>2.09</stddev>
<median>1.75</median>
<percentile>2.86</percentile>
<max>10.00</max>
<min>1.00</min>
</buy>
<sell>
<volume>62024574</volume>
<avg>7.88</avg>
<stddev>4.72</stddev>
<median>6.90</median>
<percentile>4.72</percentile>
<max>29.00</max>
<min>1.40</min>
</sell>
</type>
</marketstat>
</exec_api>
这是我正在使用 atm 的代码
import urllib.request
from urllib.request import Request, urlopen
import xml.etree.ElementTree as ET
from decimal import Decimal
reqs = Request('https://api.evemarketer.com/ec/marketstat?typeid=215', headers={'User-Agent': 'Mozilla/5.0'})
with urllib.request.urlopen(reqs) as url1:
tree = ET.parse(url1)
root = tree.getroot()
for type_ in root.iter('type'):
print(type_.attrib)
for action in root.find('./marketstat/type'):
print(" %s" % action.tag)
if action.tag == 'buy':
for buy in root.find("./marketstat/type/buy"):
print(" %s:%.2f" % ( buy.tag , Decimal( buy.text.replace(',','.') ) ))
if action.tag == 'sell':
for sell in root.find("./marketstat/type/sell"):
print(" %s:%.2f" % ( sell.tag , Decimal( sell.text.replace(',','.') ) ))
这是程序的输出
{'id': '215'}
buy
volume:161730411.00
avg:1.91
stddev:2.09
median:1.75
percentile:2.86
max:10.00
min:1.00
sell
volume:62024574.00
avg:7.88
stddev:4.72
median:6.90
percentile:4.72
max:29.00
min:1.40
程序正在做的是搜索类型标签,然后买卖,并返回标签和值,然后当我使用这个 xml 时
reqs = Request('https://api.evemarketer.com/ec/marketstat?typeid=215,216', headers={'User-Agent': 'Mozilla/5.0'})
这是使用新 xml 运行程序所需的唯一更改
<exec_api version="2.0" method="marketstat_xml">
<marketstat>
<type id="215">
<buy>
<volume>161730411</volume>
<avg>1.91</avg>
<stddev>2.09</stddev>
<median>1.75</median>
<percentile>2.86</percentile>
<max>10.00</max>
<min>1.00</min>
</buy>
<sell>
<volume>62024574</volume>
<avg>7.88</avg>
<stddev>4.72</stddev>
<median>6.90</median>
<percentile>4.72</percentile>
<max>29.00</max>
<min>1.40</min>
</sell>
</type>
<type id="216">
<buy>
<volume>154135069</volume>
<avg>1.40</avg>
<stddev>2.53</stddev>
<median>1.00</median>
<percentile>3.27</percentile>
<max>8.47</max>
<min>1.00</min>
</buy>
<sell>
<volume>21843272</volume>
<avg>12.17</avg>
<stddev>20.15</stddev>
<median>8.42</median>
<percentile>4.71</percentile>
<max>130.00</max>
<min>0.17</min>
</sell>
</type>
</marketstat>
</exec_api>
这是程序的结果
{'id': '215'}
buy
volume:161730411.00
avg:1.91
stddev:2.09
median:1.75
percentile:2.86
max:10.00
min:1.00
sell
volume:62024574.00
avg:7.88
stddev:4.72
median:6.90
percentile:4.72
max:29.00
min:1.40
{'id': '216'}
buy
volume:161730411.00
avg:1.91
stddev:2.09
median:1.75
percentile:2.86
max:10.00
min:1.00
sell
volume:62024574.00
avg:7.88
stddev:4.72
median:6.90
percentile:4.72
max:29.00
min:1.40
如您所见,转移到 的结果,然后当我增加类型 id 元素的数量时,它们都从第一个获取数据。
谢谢,如果您对代码或问题有什么不明白的地方,请告诉我,我会尝试 awnser
【问题讨论】:
标签: python python-3.x xml