Właśnie wczoraj zacząłem pracować z plikami JSON i przeszukałem inne pytania dotyczące KeyError, ale jak dotąd żadna z odpowiedzi nie pomogła. Próbuję przeanalizować ten plik JSON i utworzyć słownik, dzięki czemu „artykuł” jest kluczem i „wyświetla” wartość. Jednak po prostu otrzymuję KeyError, gdy próbuję go wydrukować. Kod działa, jeśli używam innego adresu URL, ale muszę użyć tego. Czy po prostu źle to drukuję?

def display(url, text):
    print(url)
    dictionary = json.loads(text)
    for item in dictionary['items']:
        print(f"{item['article']}:\t\t{item['views']}")


def main():
    url = "https://wikimedia.org/api/rest_v1/metrics/pageviews/top/en.wikiversity/all-access/2018/01/all-days"
    display(url, text)



main()
2
Will91099 31 marzec 2020, 21:23

3 odpowiedzi

Najlepsza odpowiedź

Patrząc na rzeczywiste dane JSON:

{
  "items": [
    {
      "project": "en.wikiversity",
      "access": "all-access",
      "year": "2018",
      "month": "01",
      "day": "all-days",
      "articles": [
        {
          "article": "Psycholinguistics/Models_of_Speech_Production",
          "views": 585462,
          "rank": 1
        },
        {
          "article": "Wikiversity:Main_Page",
          "views": 118971,
          "rank": 2
        },
        {
          "article": "Special:Search",
          "views": 60332,
          "rank": 3
        },

Nie szukasz items[n]['article|views'], tak naprawdę szukasz items[n]['articles'][n]['article|views']

def display(url, text):
    print(url)
    dictionary = json.loads(text)
    for item in dictionary['items']:
        for article in item['articles']:
            print(f"{article['article']}:\t\t{article['views']}")
3
bnlucas 31 marzec 2020, 18:29

Użyj przeglądarki json, takiej jak w przeglądarce Firefox, aby przeglądać pliki json. Nie odnosisz się do tego poprawnie.

Po pierwsze, ta strona ma tylko jeden wpis w pozycjach, więc iteracja wydaje się dziwna.

Tak czy inaczej, w pętli for każdy element jest dyktatem. Istnieje klucz zwany artykułami, który jest listą poleceń, więc będziesz potrzebować zagnieżdżonej pętli.

def display(url, text):
    print(url)
    dictionary = json.loads(text)
    for item in dictionary['items']:
        for article in item['articles']:
            print(f"{article['article']}:\t\t{article['views']}")

0
Gregory 31 marzec 2020, 18:48

Tylko jedna rzecz jest nie tak z twoim kodem:

Nie ma klucza article na elementach, które wykonujesz. Właściwie jest w nim lista artykułów. Jeśli więc po prostu dodasz:

for article in item['articles']:

To zadziała (zmień metodę wyświetlania):

def display(url, text):
    print(url)
    dictionary = json.loads(text)
    for item in dictionary['items']:
        for article in item['articles']:
            print(f"{article['article']}:\t\t{article['views']}")
1
Rafael Marques 31 marzec 2020, 18:32