【问题标题】:How can I filter API GET Request on multiple variables?如何过滤多个变量的 API GET 请求?
【发布时间】:2020-09-17 15:45:39
【问题描述】:

我真的在努力解决这个问题。我是 python 新手,我正在尝试从 API 中提取数据。

我已设法运行下面的脚本,但我需要修改它以过滤一列的多个值,比如说英格兰和苏格兰。 SQL IN 运算符是否有等价物,例如Area_Name IN ('England','Scotland')。

from requests import get
from json import dumps


ENDPOINT = "https://api.coronavirus.data.gov.uk/v1/data"
AREA_TYPE = "nation"
AREA_NAME = "england"

filters = [
    f"areaType={ AREA_TYPE }",
    f"areaName={ AREA_NAME }"
]

structure = {
    "date": "date",
    "name": "areaName",
    "code": "areaCode",
    "dailyCases": "newCasesByPublishDate",
}


api_params = {
    "filters": str.join(";", filters),
    "structure": dumps(structure, separators=(",", ":")),
    "latestBy": "cumCasesByPublishDate"
}


formats = [
    "json",
    "xml",
    "csv"
]


for fmt in formats:
    api_params["format"] = fmt
    response = get(ENDPOINT, params=api_params, timeout=10)
    assert response.status_code == 200, f"Failed request for {fmt}: {response.text}"
    print(f"{fmt} data:")
    print(response.content.decode())

【问题讨论】:

    标签: python api get python-requests endpoint


    【解决方案1】:

    我已经尝试过脚本,在这种情况下,dict 是最容易处理的类型。 给定你的 json 数据输出

    data = {"length":1,"maxPageLimit":1,"data":[{"date":"2020-09-17","name":"England","code":"E92000001","dailyCases":2788}],"pagination":{"current":"/v1/data?filters=areaType%3Dnation%3BareaName%3Dengland&structure=%7B%22date%22%3A%22date%22%2C%22name%22%3A%22areaName%22%2C%22code%22%3A%22areaCode%22%2C%22dailyCases%22%3A%22newCasesByPublishDate%22%7D&latestBy=cumCasesByPublishDate&format=json&page=1","next":null,"previous":null,"first":"/v1/data?filters=areaType%3Dnation%3BareaName%3Dengland&structure=%7B%22date%22%3A%22date%22%2C%22name%22%3A%22areaName%22%2C%22code%22%3A%22areaCode%22%2C%22dailyCases%22%3A%22newCasesByPublishDate%22%7D&latestBy=cumCasesByPublishDate&format=json&page=1","last":"/v1/data?filters=areaType%3Dnation%3BareaName%3Dengland&structure=%7B%22date%22%3A%22date%22%2C%22name%22%3A%22areaName%22%2C%22code%22%3A%22areaCode%22%2C%22dailyCases%22%3A%22newCasesByPublishDate%22%7D&latestBy=cumCasesByPublishDate&format=json&page=1"}}
    

    你可以试试这样的:

    countries = ['England', 'France', 'Whatever']
    return [country for country in data where country['name'] in countries]
    

    我认为数据列表是数据字典中唯一有趣的键,因为所有其他键都没有任何有意义的值。

    【讨论】:

    • 谢谢。我希望能够在请求中过滤它,但不在输出中
    • 除非 API 允许使用特定的正文格式,否则您不能在请求级别这样做
    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    相关资源
    最近更新 更多