Записать Xml ответы в датафрейм

Мне нужно вытащить данные из Graylog и создать из них датафрейм для дальнейшей обработки

import http.client
import pandas as pd
import json
from lxml import objectify

conn = http.client.HTTPConnection("192.125.135.028:3000")
payload = '''{"from": 0,"size": 10000,"_source": ["receiveMessage"],"query": {"bool": {"must": 
{"query_string": {"query": "nmnls","allow_leading_wildcard": false}},"filter": [{"term": {"recType": 
"3"}},{"range": {"timestamp": {"gte": "2020-10-29 10:00:00.000","lt": "2020-10-29 
10:02:00.000","time_zone": "+06:00"}}}]}}}'''
headers = { 'content-type': "application/json" }
conn.request("POST", "/_search", payload, headers)
res = conn.getresponse()

data = res.read()

res = json.loads(data)

i = 0
for m in res["hits"]["hits"]:
  if i == 10000:
     break
 i+=1
 print(m["_source"]["receiveMessage"])

В результате я получаю xml ответы вида

<request>
    <guid>bc94cb431a32d431</guid>
    <type>3</type>
    <body>
        <payments>
            <payment>
                <account>XXXXXX</account>
                <amount>2000.00</amount>
                <idService>XXXX</idService>
                <idTerminal>XXXXX</idTerminal>
                <comission>120.00</comission>
                <date>20201029100149</date>
                <numTrans>XXXXXXXXXXXXXX</numTrans>
                <nmnls>
                    <nmnl val="2000">1</nmnl>
                </nmnls>
                <lang>r</lang>
            </payment>
        </payments>
    </body>
    <sign>3cba03091b2f258c0087f405fa</sign>
</request>

из этого ответа мне нужен датафрейм с двумя колонками numTrans и nmnls и вот тут я застряла. Как вытащить только эти значения и сложить в датайфрейм? Я так понимаю, для начала эти ответы нужно преобразовать в словарь, например, или строку.

df = pd.DataFrame(m)

создает датафрейм, но весь ответ кладет в отдельную ячейку полностью


Ответы (1 шт):

Автор решения: CrazyElf

Я немного ошибся, в самой библиотеке Pandas нет инструментов для чтения XML (хотя я был уверен, что есть), но можно воспользоваться сторонней библиотекой pandas_read_xml:

# pip install pandas-read-xml

import pandas as pd
import pandas_read_xml as pdx

xml = '''
<request>
    <guid>bc94cb431a32d431</guid>
    <type>3</type>
    <body>
        <payments>
            <payment>
                <account>XXXXXX</account>
                <amount>2000.00</amount>
                <idService>XXXX</idService>
                <idTerminal>XXXXX</idTerminal>
                <comission>120.00</comission>
                <date>20201029100149</date>
                <numTrans>XXXXXXXXXXXXXX</numTrans>
                <nmnls>
                    <nmnl val="2000">1</nmnl>
                </nmnls>
                <lang>r</lang>
            </payment>
        </payments>
    </body>
    <sign>3cba03091b2f258c0087f405fa</sign>
</request>'''

df = pdx.read_xml(xml, ["request", "body", "payments", "payment"]) # путь к корневому элементу

Тогда в df будет вот что:

    account amount  idService   idTerminal  comission   date    numTrans    nmnls   lang
nmnl    XXXXXX  2000.00 XXXX    XXXXX   120.00  20201029100149  XXXXXXXXXXXXXX  {'@val': '2000', '#text': '1'}  r

В частности интересующие вас поля:

df[['numTrans','nmnls']]

Вывод:

              numTrans  nmnls
nmnl    XXXXXXXXXXXXXX  {'@val': '2000', '#text': '1'}
→ Ссылка