如何在 Python 中使用 SOAP API(XML 格式)



我以前从未使用过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

最新更新