从XML响应中提取CSV文件

byqmnocz  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(221)

我有这样一段代码,它返回一个XML响应。

import requests

url = "https://www-genesis.destatis.de/genesisWS/web/ExportService_2010?method=TabellenExport&kennung=DEB924AL95&passwort=P@ssword123&name=42151-0002&bereich=Alle&format=csv&strukturinformation=false&komprimieren=false&transponieren=true&startjahr=&endjahr=&zeitscheiben=&regionalmerkmal=&regionalschluessel=&sachmerkmal=FAMSTD&sachschluessel=VERH&sachmerkmal2=&sachschluessel2=&sachmerkmal3=&sachschluessel3=&stand=&auftrag=false&sprache=en"

payload = "<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\nxmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\r\nxmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"\r\nxmlns:web=\"http://webservice_2010.genesis\">\r\n <soapenv:Header/>\r\n <soapenv:Body>\r\n <web:TabellenExport soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\r\n <kennung xsi:type=\"xsd:string\">DEB924AL95</kennung>\r\n <passwort xsi:type=\"xsd:string\">P@ssword123</passwort>\r\n <namen xsi:type=\"xsd:string\">42151-0002</namen>\r\n <bereich xsi:type=\"xsd:string\">alle</bereich>\r\n <format xsi:type=\"xsd:string\">csv</format>\r\n <strukturinformation xsi:type=\"xsd:boolean\">false</strukturinformation>\r\n <komprimieren xsi:type=\"xsd:boolean\">false</komprimieren>\r\n <transponieren xsi:type=\"xsd:boolean\">false</transponieren>\r\n\r\n <startjahr xsi:type=\"xsd:string\"></startjahr>\r\n <endjahr xsi:type=\"xsd:string\"></endjahr>\r\n <zeitscheiben xsi:type=\"xsd:string\"></zeitscheiben>\r\n <regionalmerkmal xsi:type=\"xsd:string\"></regionalmerkmal>\r\n <regionalschluessel xsi:type=\"xsd:string\"></regionalschluessel>\r\n <sachmerkmal xsi:type=\"xsd:string\">FAMSTD</sachmerkmal>\r\n <sachschluessel xsi:type=\"xsd:string\">VERH</sachschluessel>\r\n <sachmerkmal2 xsi:type=\"xsd:string\"></sachmerkmal2>\r\n <sachschluessel2 xsi:type=\"xsd:string\"></sachschluessel2>\r\n <sachmerkmal3 xsi:type=\"xsd:string\"></sachmerkmal3>\r\n <sachschluessel3 xsi:type=\"xsd:string\"></sachschluessel3>\r\n <stand xsi:type=\"xsd:string\"></stand>\r\n <auftrag xsi:type=\"xsd:boolean\">false</auftrag>\r\n <sprache xsi:type=\"xsd:string\">de</sprache>\r\n </web:TabellenExport>\r\n </soapenv:Body>\r\n</soapenv:Envelope>\r\n\r\n"
headers = {
  'Content-Type': 'application/xml'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)

得到的响应中有CSV数据。它在标签中:

<tabellenDaten>

如何提取此表并使用它创建Pandas DataFrame?

bakd9h0s

bakd9h0s1#

您可以使用BeautifulSoup解析响应,然后提取csv数据,最后使用pandas作为StringIO对象进行解析

import io
import pandas as pd
import requests
from bs4 import BeautifulSoup

# Parse response and extract the csv data
soup = BeautifulSoup(response.text, "lxml")
table = soup.find("tabellendaten")

# Create a text stream, which read_csv expects
f = io.StringIO(table.text)

df = pd.read_csv(f, sep = ";")

CSV似乎是一个MultiIndex DataFrame,因此您可能需要在read_csv方法中使用关键字index_col调整代码(请参见documentation

编辑:

CSV看起来很疯狂。这是我发现的使用pandas导入CSV而不预处理CSV的最佳选项。

df = pd.read_csv(f,
    sep = ";",
    engine = "python",
    skipinitialspace = True,
    skipfooter = 3,
    skiprows = range(7),
    header = [0,1,2,3],
    index_col = [0,1],
)
h43kikqp

h43kikqp2#

看看标准库中的ElementTree库。您可以读入这个xml,然后获取其中包含的数据。
如果它是有效的CSV,你可以把它交给pandas。

相关问题