我以前从未使用过SOAP API。与REST API不同,在Python中使用SOAP API似乎并不那么简单。由于 REST API 带有 JSON 格式,因此您可以通过执行类似 data.student.name
的操作来访问。我有以下带有XML格式的SOAP API。
谁能解释一下我如何在 Python 代码级别访问数据中的Rank
?
data (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>
回答有点晚了,但它可能会帮助有类似问题的人。
问题中的响应来自Alexa AWIS API,它返回XML格式的响应,需要以某种JSON或python字典格式解析才能访问其中的值。
我也遇到了这个问题,并通过使用此函数进行解析来解决它,该函数使用xmltodict
库来解析 XML 进行字典,然后递归修复字典键。
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