基于Python调用SOAP API提取乐高积木数据的技术咨询
处理乐高Brickset SOAP API返回的XML数据
嘿,我来帮你搞定这个SOAP返回的XML解析问题!Python里有几个实用的工具能轻松处理这类场景,我给你推荐两种方案,分别适合不同需求:
方案1:用Python内置的ElementTree(零额外依赖)
这个方案不用装任何第三方包,适合快速实现需求。重点要注意XML的命名空间——这是很多人踩坑的地方,你的返回XML根节点带了xmlns="https://brickset.com/api/",所有子元素都属于这个命名空间,直接找标签名会找不到内容。
import xml.etree.ElementTree as ET import requests # 先通过HTTP请求获取XML内容(这里用requests做示例,你可以替换成自己的请求逻辑) response = requests.get("你的SOAP API请求地址") xml_content = response.text # 解析XML字符串 root = ET.fromstring(xml_content) # 定义命名空间映射,给官方命名空间加个短前缀方便调用 ns = {'bs': 'https://brickset.com/api/'} # 找到所有<sets>节点 all_sets = root.findall('.//bs:sets', ns) # 遍历每个set,提取你需要的字段 for set_item in all_sets: set_id = set_item.find('bs:setID', ns).text set_number = set_item.find('bs:number', ns).text set_name = set_item.find('bs:name', ns).text variant = set_item.find('bs:numberVariant', ns).text print(f"乐高套装:{set_name} | 编号:{set_number} | ID:{set_id} | 版本:{variant}")
方案2:用lxml(更灵活,支持复杂XPath查询)
如果你的XML结构更复杂,或者需要更强大的查询能力,lxml会是更好的选择。先安装它:
pip install lxml
然后是代码示例:
from lxml import etree import requests response = requests.get("你的SOAP API请求地址") xml_content = response.text # 解析XML root = etree.fromstring(xml_content) # 注册命名空间,避免XPath查询时的麻烦 etree.register_namespace('bs', 'https://brickset.com/api/') # 用XPath直接定位所有sets节点 all_sets = root.xpath('//bs:sets', namespaces={'bs': 'https://brickset.com/api/'}) # 提取字段,XPath可以直接获取文本内容 for set_item in all_sets: set_id = set_item.xpath('./bs:setID/text()', namespaces={'bs': 'https://brickset.com/api/'})[0] set_number = set_item.xpath('./bs:number/text()', namespaces={'bs': 'https://brickset.com/api/'})[0] set_name = set_item.xpath('./bs:name/text()', namespaces={'bs': 'https://brickset.com/api/'})[0] print(f"[{set_id}] {set_number} - {set_name}")
关键提醒
- 一定要处理命名空间!直接写
find('sets')或者xpath('//sets')会找不到任何元素,必须带上我们定义的前缀。 - 如果你的SOAP请求是POST类型(需要发送XML格式的请求体),可以用
requests.post,把SOAP信封作为data参数传入,返回的XML同样用上面的方法解析就行。
内容的提问来源于stack exchange,提问作者Nico Schuck
相关产品推荐
相关产品推荐

