我以前从未使用过SOAP API。与REST API不同,在Python中使用SOAP API似乎并不那么简单。由于REST API带有JSON格式,因此您只需执行类似data.student.name
的操作即可访问。我有以下XML格式附带的SOAP API。
有人能解释我如何在Python代码级别的数据中访问Rank
吗?
数据(SOAP API)
<?xml version="1.0" ?>
<Awis>
<OperationRequest>
<RequestId>6153688e-865c-11e9-84c7-196fdec7da01</RequestId>
</OperationRequest>
<Results>
<Result>
<Alexa>
<Request>
<Arguments>
<Argument>
<Name>url</Name>
<Value>sfgate.com</Value>
</Argument>
<Argument>
<Name>responsegroup</Name>
<Value>Rank</Value>
</Argument>
</Arguments>
</Request>
<TrafficData>
<DataUrl>sfgate.com/</DataUrl>
<Rank>1441</Rank>
</TrafficData>
</Alexa>
</Result>
<ResponseStatus>
<StatusCode>200</StatusCode>
</ResponseStatus>
</Results>
</Awis>
答案 0 :(得分:0)
回答有点晚,但它可能会帮助有类似问题的人。
问题中的响应来自 Alexa AWIS API,它返回 XML 格式的响应,该响应需要以某种 JSON 或 python dict 格式进行解析以访问其中的值。< /p>
我也遇到了这个问题并通过使用这个函数解析来解决它,它使用 xmltodict
库将 XML 解析为 dict,然后递归修复 dict 键。
def xml_to_json(xml_str):
def fix_dict(a_dict):
new_dict = a_dict.copy()
for k,v in a_dict.items():
if k.startswith('aws:'):
k = k[4:]
del new_dict["aws:"+k]
if k.startswith("@"):
del new_dict[k]
continue
if type(v) == dict:
v = fix_dict(v)
elif type(v) == list:
v = [fix_dict(i) for i in v if type(i)==dict]
new_dict.update({k:v})
return new_dict
parsed_dict = xmltodict.parse(xml_str, dict_constructor=dict, cdata_key='text')
fixed_dict = fix_dict(parsed_dict)
return fixed_dict