python - 如何解析来自 zeep 的嵌套 XML 响应?
问题描述
我已经开始使用 zeep 发出 WSSL 请求,并且与我的预期相反,响应不是 python dict 而是 XML:
"<?xml version='1.0' encoding='ISO-8859-1'?>\n<SERIES>\n<SERIE ID='1'>\n\t\t<ITEM>\n\t\t\t<DATA>2/1/2020</DATA>\n\t\t\t<VALOR>4.0213</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>3/1/2020</DATA>\n\t\t\t<VALOR>4.0522</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>6/1/2020</DATA>\n\t\t\t<VALOR>4.0554</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>7/1/2020</DATA>\n\t\t\t<VALOR>4.0841</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>8/1/2020</DATA>\n\t\t\t<VALOR>4.0672</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>9/1/2020</DATA>\n\t\t\t<VALOR>4.0744</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>10/1/2020</DATA>\n\t\t\t<VALOR>4.0745</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>13/1/2020</DATA>\n\t\t\t<VALOR>4.1309</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>14/1/2020</DATA>\n\t\t\t<VALOR>4.1443</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>15/1/2020</DATA>\n\t\t\t<VALOR>4.1622</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>16/1/2020</DATA>\n\t\t\t<VALOR>4.1726</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>17/1/2020</DATA>\n\t\t\t<VALOR>4.1837</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>20/1/2020</DATA>\n\t\t\t<VALOR>4.1829</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>21/1/2020</DATA>\n\t\t\t<VALOR>4.2014</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>22/1/2020</DATA>\n\t\t\t<VALOR>4.1889</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>23/1/2020</DATA>\n\t\t\t<VALOR>4.1662</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>24/1/2020</DATA>\n\t\t\t<VALOR>4.1769</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>27/1/2020</DATA>\n\t\t\t<VALOR>4.2196</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>28/1/2020</DATA>\n\t\t\t<VALOR>4.2064</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>29/1/2020</DATA>\n\t\t\t<VALOR>4.2013</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>30/1/2020</DATA>\n\t\t\t<VALOR>4.2523</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>31/1/2020</DATA>\n\t\t\t<VALOR>4.2695</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t</SERIE>\n</SERIES>"
到目前为止,我已经在 zeep 中尝试了 Helper 类:
zeep.helpers.serialize_object(response['_value_1'])
并提取 XML 树:
ElementTree(et.fromstring(teste))
这是一个可重现的示例:
import pandas as pd
from requests import Session
from zeep import Client
from zeep.transports import Transport
import os
session = Session()
url = 'https://www3.bcb.gov.br/sgspub/JSP/sgsgeral/FachadaWSSGS.wsdl'
client = Client(url)
# arrayOffLong Constructor
arrayOffLong = client.get_type('ns0:ArrayOfflong')
response = client.service.getValoresSeriesXML(arrayOffLong([1]), '01/01/2020', '01/02/2020')
解决方案
这是将 XML 字符串转换为 python dic 的方法
from simplified_scrapy import SimplifiedDoc, utils, req
xml = "<?xml version='1.0' encoding='ISO-8859-1'?>\n<SERIES>\n<SERIE ID='1'>\n\t\t<ITEM>\n\t\t\t<DATA>2/1/2020</DATA>\n\t\t\t<VALOR>4.0213</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>3/1/2020</DATA>\n\t\t\t<VALOR>4.0522</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>6/1/2020</DATA>\n\t\t\t<VALOR>4.0554</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>7/1/2020</DATA>\n\t\t\t<VALOR>4.0841</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>8/1/2020</DATA>\n\t\t\t<VALOR>4.0672</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>9/1/2020</DATA>\n\t\t\t<VALOR>4.0744</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>10/1/2020</DATA>\n\t\t\t<VALOR>4.0745</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>13/1/2020</DATA>\n\t\t\t<VALOR>4.1309</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>14/1/2020</DATA>\n\t\t\t<VALOR>4.1443</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>15/1/2020</DATA>\n\t\t\t<VALOR>4.1622</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>16/1/2020</DATA>\n\t\t\t<VALOR>4.1726</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>17/1/2020</DATA>\n\t\t\t<VALOR>4.1837</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>20/1/2020</DATA>\n\t\t\t<VALOR>4.1829</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>21/1/2020</DATA>\n\t\t\t<VALOR>4.2014</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>22/1/2020</DATA>\n\t\t\t<VALOR>4.1889</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>23/1/2020</DATA>\n\t\t\t<VALOR>4.1662</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>24/1/2020</DATA>\n\t\t\t<VALOR>4.1769</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>27/1/2020</DATA>\n\t\t\t<VALOR>4.2196</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>28/1/2020</DATA>\n\t\t\t<VALOR>4.2064</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>29/1/2020</DATA>\n\t\t\t<VALOR>4.2013</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>30/1/2020</DATA>\n\t\t\t<VALOR>4.2523</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t\t<ITEM>\n\t\t\t<DATA>31/1/2020</DATA>\n\t\t\t<VALOR>4.2695</VALOR>\n\t\t\t<BLOQUEADO>false</BLOQUEADO>\n\t\t</ITEM>\n\t</SERIE>\n</SERIES>"
doc = SimplifiedDoc(xml)
items = doc.selects('ITEM').children
data = []
for item in items:
dic = {}
for ele in item:
dic[ele.tag]=ele.text
data.append(dic)
print (data)
结果:
[{'DATA': '2/1/2020', 'VALOR': '4.0213', 'BLOQUEADO': 'false'}, {'DATA': '3/1/2020', 'VALOR': '4.0522', 'BLOQUEADO': 'false'}, {'DATA': '6/1/2020', 'VALOR': '4.0554', 'BLOQUEADO': 'false'}, {'DATA': '7/1/2020', 'VALOR': '4.0841', 'BLOQUEADO': 'false'}, {'DATA': '8/1/2020', 'VALOR': '4.0672', 'BLOQUEADO': 'false'}, {'DATA': '9/1/2020', 'VALOR': '4.0744', 'BLOQUEADO': 'false'}, {'DATA': '10/1/2020', 'VALOR': '4.0745', 'BLOQUEADO': 'false'}, {'DATA': '13/1/2020', 'VALOR': '4.1309', 'BLOQUEADO': 'false'}, {'DATA': '14/1/2020', 'VALOR': '4.1443', 'BLOQUEADO': 'false'}, {'DATA': '15/1/2020', 'VALOR': '4.1622', 'BLOQUEADO': 'false'}, {'DATA': '16/1/2020', 'VALOR': '4.1726', 'BLOQUEADO': 'false'}, {'DATA': '17/1/2020', 'VALOR': '4.1837', 'BLOQUEADO': 'false'}, {'DATA': '20/1/2020', 'VALOR': '4.1829', 'BLOQUEADO': 'false'}, {'DATA': '21/1/2020', 'VALOR': '4.2014', 'BLOQUEADO': 'false'}, {'DATA': '22/1/2020', 'VALOR': '4.1889', 'BLOQUEADO': 'false'}, {'DATA': '23/1/2020', 'VALOR': '4.1662', 'BLOQUEADO': 'false'}, {'DATA': '24/1/2020', 'VALOR': '4.1769', 'BLOQUEADO': 'false'}, {'DATA': '27/1/2020', 'VALOR': '4.2196', 'BLOQUEADO': 'false'}, {'DATA': '28/1/2020', 'VALOR': '4.2064', 'BLOQUEADO': 'false'}, {'DATA': '29/1/2020', 'VALOR': '4.2013', 'BLOQUEADO': 'false'}, {'DATA': '30/1/2020', 'VALOR': '4.2523', 'BLOQUEADO': 'false'}, {'DATA': '31/1/2020', 'VALOR': '4.2695', 'BLOQUEADO': 'false'}]
推荐阅读
- c++ - 通过 Rcpp 和 bit64 R 包将最大的 int64_t 变量值从 C++ 传递到 R
- javafx - 使用 JavaFX,setOnMouseDragged 函数不适用于 TabPane,而它适用于 Canvas。如何让它与 TabPane 一起使用?
- xml - VB.net 将 XML 反序列化为 Class 而忽略一些标签
- swift - 收到通知时如何在 AppDelegate 中显示特定的 viewController?
- java - 使用自定义 ItemReader 调用带有 IN 和 OUT 参数的存储过程
- javascript - 如何将命令式 Promise 转换为功能性任务?
- google-app-engine - 对于较大的实例类(F4 及以上),max_concurrent_requests 是否可以大于 80
- c# - 使用 dotnet 模板创建空文件夹
- python - 使用可用值集绘制正态分布曲线的问题
- c# - 如何将 XElement 值解析为模型对象