Как разобрать вложенный ответ XML от zeep? - PullRequest
0 голосов
/ 05 августа 2020

Я начал использовать 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>"

Пока что я ' Мы пробовали классы Helper в zeep:

zeep.helpers.serialize_object(response['_value_1'])

и извлекали XML tree:

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')

1 Ответ

0 голосов
/ 07 августа 2020

Вот как превратить XML строку в python di c

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'}]
...