Синтаксический анализ строки JSON из URL с помощью Python 3.5.2

#python

#python

Вопрос:

Я пытаюсь распечатать значения "lat" и "lon" из JSON (источника):

 {
    "batchcomplete": "",
    "query": {
        "normalized": [
            {
                "from": "venice",
                "to": "Venice"
            }
        ],
        "pages": {
            "32616": {
                "coordinates": [
                    {
                        "globe": "earth",
                        "lat": 45.4375,
                        "lon": 12.33583333,
                        "primary": ""
                    }
                ],
                "ns": 0,
                "pageid": 32616,
                "title": "Venice"
            }
        }
    }
}
  

Это мой код, который я должен был работать:

 import urllib.request as url
import json
import urllib.parse
import ast

request = url.Request('https://en.wikipedia.org/w/api.php?action=queryamp;format=jsonamp;prop=coordinatesamp;list=amp;titles=venice')
data = url.urlopen(request).read()
data = data.decode("utf-8")
data = ast.literal_eval(data)
data = json.dumps(data)
array = json.loads(data)
#print(array)
print(array['query']['pages']['32616']['coordinates']['lat' ',' 'lon'])
  

Он возвращает ошибку: TypeError: list indices must be integers or slices, not str .

Комментарии:

1.У вас где-то есть список словарей. Можете ли вы показать минимальный array

Ответ №1:

 print(array['query']['pages']['32616']['coordinates'][0]['lat'])
print(array['query']['pages']['32616']['coordinates'][0]['lon'])
                                               insert ^
  

Комментарии:

1. Спасибо, я вижу свою ошибку. не учитывал [0]! Это работает отлично. но я столкнулся с другой проблемой. Я не рассматривал третье значение моего документа json [‘32616’] как динамическую переменную (это page_id). Знаете ли вы, «Как я могу работать с динамическими ключами в Python 3x?

2. Вы могли бы просто перебирать элементы в array['query']['pages'] , например, так: for key, value in array['query']['pages'].items(): . Затем вы можете получить value['coordinates'][0]['lat'] и ['lon'] .

3. Большое спасибо, вы были действительно полезны. Я не знаю, как я могу дать вам звезды в качестве плюса.

Ответ №2:

 import requests
import json

r = requests.get('you URL here')
rData = json.loads(r.text, encoding="utf-8")

print(rData['query']['pages']['32616']['coordinates'][0]['lat'])
print(rData['query']['pages']['32616']['coordinates'][0]['lon'])
  

Комментарии:

1. Вам даже не нужен json модуль, просто используйте r.json() .

2. Большое спасибо, все работает отлично. но я столкнулся с другой проблемой. Я не рассматривал третье значение моего документа json [‘32616’] как динамическую переменную (это page_id). Знаете ли вы, «Как я могу проанализировать документ JSON с динамическими ключами в Python 3x?»

3. для страницы в rData[‘query’][‘pages’]: