python - 如何从请求中解析 xml?

标签 python xml pandas python-requests

我查看了其他一些答案,但找不到适合我的解决方案。

这是我的完整代码,您可以在没有任何 API key 的情况下运行:

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 输出的“正确”方法是什么?我的最终目标是拥有一个包含 datevalue 列的 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)))

读入DataFrame:

pd.read_json(response_json) 

然后你只需要玩东方之类的 (文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html)

关于python - 如何从请求中解析 xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59895729/

相关文章:

python - 使用 google bigquery API 时避免 DefaultCredentialsError

android - 将 addtextchangedlistener 用于 NavigationView Edittext 时出错

python - 如何使用 Makefile 组合单元测试结果?

java - 根据用户输入设置菜单项android

java - 在 Android 中自定义 Google SignInButton

python - 按多个列值过滤 Pandas 数据框行

pandas - 在 Pandas 中显示与字典键名不同的列名?

python - 如何在 read_json 上定义数据类型?

python - python中顶点列表(不是两个顶点)之间的距离

java - 如何在Java中使用python代码?