You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中从SOAP响应XML获取Bearer Token

解决SOAP响应中读取Bearer Token的问题

你的代码失败主要是两个原因:XML命名空间未处理,还有代码里的import语法错误。下面给你修正后的解决方案:

问题分析

你拿到的SOAP XML包含两个命名空间:

  • soapenv: 对应http://schemas.xmlsoap.org/soap/envelope/
  • ofo: 对应http://dummyurl.com/xsd/xyz
    直接用find('Envelope/Body/GetToken/Token')找不到元素,因为这些标签都属于各自的命名空间;而且root本身就是<soapenv:Envelope>元素,路径里不需要再写Envelope。另外你代码里的import import lxml.etree是语法错误,要改成import lxml.etree。

修正后的代码

方法1:使用find并指定命名空间

import lxml.etree
import requests

# 发送请求获取响应
response = requests.post(url, data=body, headers=headers)
root = lxml.etree.fromstring(response.content)

# 定义命名空间映射
namespaces = {
    'soapenv': 'http://schemas.xmlsoap.org/soap/envelope/',
    'ofo': 'http://dummyurl.com/xsd/xyz'
}

# 从root(Envelope)开始定位Token元素
token_elem = root.find('soapenv:Body/ofo:GetToken/ofo:Token', namespaces=namespaces)
if token_elem is not None:
    bearer_token = token_elem.text.strip()
    print(bearer_token)  # 输出: Bearer 123sfafweo123
else:
    print("未找到Token元素")

方法2:使用XPath查询

XPath处理命名空间更灵活,适合复杂XML结构:

import lxml.etree
import requests

response = requests.post(url, data=body, headers=headers)
root = lxml.etree.fromstring(response.content)

namespaces = {
    'soapenv': 'http://schemas.xmlsoap.org/soap/envelope/',
    'ofo': 'http://dummyurl.com/xsd/xyz'
}

# 用XPath直接定位Token元素
token_elem = root.xpath('//ofo:Token', namespaces=namespaces)[0]
bearer_token = token_elem.text.strip()
print(bearer_token)

关键点说明

  • 查询时必须指定命名空间映射,XML解析器才能识别带前缀的标签
  • root是<soapenv:Envelope>节点,路径从soapenv:Body开始即可
  • 记得检查元素是否存在,避免出现索引越界或None调用text属性的错误

内容的提问来源于stack exchange,提问作者user29496

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:01:43