[英]How to parse xml from requests?
我查看了其他一些答案,但找不到對我有用的解決方案。
這是我的完整代碼,無需任何 API 密鑰即可運行:
import requests
r = requests.get('http://api.worldbank.org/v2/country/GBR/indicator/NY.GDP.MKTP.KD.ZG')
如果我打印r.text
,我會得到一個以
'\ufeff<?xml version="1.0" encoding="utf-8"?>\r\n<wb:data page="1" pages="2" per_page="50" total="60" sourceid="2" lastupdated="2019-12-20" xmlns:wb="http://www.worldbank.org">\r\n <wb:data>\r\n <wb:indicator id="NY.GDP.MKTP.KD.ZG">GDP growth (annual %)</wb:indicator>\r\n <wb:country id="GB">United Kingdom</wb:country>\r\n <wb:countryiso3code>GBR</wb:countryiso3code>\r\n <wb:date>2019</wb:date>\r\n`
並持續一段時間。
獲得我想要的東西的一種方法(據我所知,這是非常不鼓勵的)是使用正則表達式:
import regex
import pandas as pd
import re
pd.DataFrame(
re.findall(
r"<wb:date>(\d{4})</wb:date>\r\n <wb:value>((?:\d\.)?\d{14})", r.text
),
columns=["date", "value"],
)
解析此 xml 輸出的“正確”方法是什么? 我的最終目標是擁有一個帶有date
和value
列的 DataFrame,例如
date value
0 2018 1.38567356958762
1 2017 1.89207703836381
2 2016 1.91815510596298
3 2015 2.35552430595799
...
以下情況如何:
解碼響應:
decoded_response = response.content.decode('utf-8')
轉換為 json:
response_json = json.loads(json.dumps(xmltodict.parse(decoded)))
讀入數據幀:
pd.read_json(response_json)
然后你只需要玩東方之類的(文檔: https : //pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html )
您可以使用ElementTree的API(如描述這里)
import requests
from xml.etree import ElementTree
response = requests.get('http://api.worldbank.org/v2/country/GBR/indicator/NY.GDP.MKTP.KD.ZG')
tree = ElementTree.fromstring(response.content)
print(tree)
但是你必須探索結構才能得到你想要的。
我最終使用的完整代碼(基於 Omri 的出色回答):
import xmltodict
import json
import pandas as pd
r = requests.get("http://api.worldbank.org/v2/country/GBR/indicator/NY.GDP.MKTP.KD.ZG")
decoded_response = r.content.decode("utf-8")
response_json = json.loads(json.dumps(xmltodict.parse(decoded_response)))
pd.DataFrame(response_json["wb:data"]["wb:data"])[["wb:date", "wb:value"]].rename(
columns=lambda x: x.replace("wb:", "")
)
這使
date value
0 2019 None
1 2018 1.38567356958762
2 2017 1.89207703836381
3 2016 1.91815510596298
4 2015 2.35552430595799
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.