【问题标题】:Getting values from complicated json content [duplicate]从复杂的json内容中获取值[重复]
【发布时间】:2021-03-30 14:52:54
【问题描述】:

所以基本上我是在网上抓取一个网站,为此我需要来自复杂 json 内容的所有位置的 "id"

https://hilfe.diakonie.de/hilfe-vor-ort/marker-json.php?ersteller=&kategorie=0&text=&n=54.14365551060835&e=19.704533281249986&s=48.00384435890099&w=1.2035567187499874&zoom=20000

我尝试了dict.items 方法,但我只得到 2 个值,它们位于 dict 开头,然后是列表开头:

res = requests.get(url).json()

json_obj = res.items()

for key, value in json_obj:
    if key == "id":
        print(value)

json = {
    "count": 17652,
    "items": [
        {
            "lat": 51.17450581504055,
            "lng": 10.007757153036533,
            "count": 17652,
            "north": 54.1425475,
            "east": 15.0019,
            "south": 48.0039543,
            "west": 5.952813,
            "elements": [
                {
                    "id": "5836de61a581c245ae48806b",
                    "o": 'null'
                },
                {
                    "id": "5836de62a581c245ae48814b",
                    "o": 'null'
                },
                {
                    "id": "5836de57a581c245ae487944",
                    "o": 'null'
                },
                {
                    "id": "5836de64a581c245ae4882a8",
                    "o": 'null'
                },
                {
                    "id": "5836de54a581c245ae48772a",
                    "o": 'null'
                },
                {
                    "id": "5836de57a581c245ae487945",
                    "o": 'null'
                }
            ]
        }
    ]
}

【问题讨论】:

标签: python json dictionary web-scraping


【解决方案1】:

id 属性嵌套在对象的 elements 属性中的数组中,而对象又嵌套在响应的 items 属性中的数组中。使用带有 2 个循环的列表推导来提取它们:

res = requests.get(url).json()

ids = [ele["id"] for v in res["items"] for ele in v["elements"]]
for id in ids:
    print(id)

【讨论】:

    【解决方案2】:

    JSON 由具有两个键值对的根字典组成。一个是count,它是一个整数,另一个是items,它映射到单个项目的列表。这个项目是一个字典,里面有几个键值对,其中一个是elements,它是一个字典列表,每个包含一个id

    import requests
    
    url = "https://hilfe.diakonie.de/hilfe-vor-ort/marker-json.php?ersteller=&kategorie=0&text=&n=54.14365551060835&e=19.704533281249986&s=48.00384435890099&w=1.2035567187499874&zoom=20000"
    
    response = requests.get(url)
    response.raise_for_status()
    
    elements = response.json()["items"][0]["elements"]
    
    # print only the first ten ids
    for element in elements[:10]:
        print(element["id"])
    

    输出:

    5836de61a581c245ae48806b
    5836de62a581c245ae48814b
    5836de57a581c245ae487944
    5836de64a581c245ae4882a8
    5836de54a581c245ae48772a
    5836de57a581c245ae487945
    5836de61a581c245ae48806c
    5836de64a581c245ae4882aa
    5836de57a581c245ae487947
    5836de62a581c245ae48814d
    >>> 
    

    【讨论】:

    • 是的,我在提出这个问题后就得出了同样的逻辑,并且我工作了。
    【解决方案3】:

    相同但不同 - 使用operator.itemgetter

    items = operator.itemgetter('items')
    elements = operator.itemgetter('elements')
    eyedees = operator.itemgetter('id')
    
    data = elements(items(json)[0])
    stuff = map(eyedees,data)
    print(list(stuff))
    

    使用问题示例中的json

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      相关资源
      最近更新 更多