Goodreads API 错误:列表索引必须是整数或切片,而不是 str

问题描述 投票:0回答:2

因此,我正在尝试使用 Goodreads 的 API 用 Python 编写一个 Goodreads 信息获取器应用程序。我目前正在开发应用程序的第一个功能,该功能将从 API 获取信息,API 返回一个 XML 文件。

我解析了 XML 文件并将其转换为 JSON 文件,然后进一步将其转换为字典。但我似乎仍然无法从中提取信息,我在这里查找了其他帖子,但没有任何作用。

main.py

def get_author_books(authorId):
    url = "https://www.goodreads.com/author/list/{}?format=xml&key={}".format(authorId, key)
    r = requests.get(url)

    xml_file = r.content
    json_file = json.dumps(xmltodict.parse(xml_file))

    data = json.loads(json_file)
    print("Book Name: " + str(data[0]["GoodreadsResponse"]["author"]["books"]["book"]))

我希望输出能够给出字典中第一本书的名称。

这里是 Goodreads 提供的示例 XML 文件。

python json api dictionary python-requests
2个回答
0
投票

我认为您缺乏对 xml 工作原理的理解,或者至少不了解您获得的响应的格式。

您链接到的 xml 文件具有以下格式:

<GoodreadsResponse>
    <Request>...</Request>
    <Author>
        <id>...</id>
        <name>...</name>
        <link>...</link>
        <books>
            <book> [some stuff about the first book] </book>
            <book> [some stuff about the second book] </book>
            [More books]
        </books>
    </Author>
</GoodreadsResponse>

这意味着在您的

data
对象中,
data["GoodreadsResponse"]["author"]["books"]["book"]
是响应中所有书籍的集合(由
<book>
标签包围的所有元素)。所以:

  • data["GoodreadsResponse"]["author"]["books"]["book"][0]
    是第一本书。
  • data["GoodreadsResponse"]["author"]["books"]["book"][1]
    是第二本书,依此类推。

回顾 xml,每个

book
元素都有一个
id
isbn
title
description
等标签。所以可以通过打印来打印第一本书的书名:

data["GoodreadsResponse"]["author"]["books"]["book"][0]["title"]

作为参考,我正在使用您链接到的 xml 文件运行以下代码,您通常会从 API 获取此代码:

import json
import xmltodict

f = open("source.xml", "r") # xml file in OP
xml_file = f.read()

json_file = json.dumps(xmltodict.parse(xml_file))
data = json.loads(json_file)

books = data["GoodreadsResponse"]["author"]["books"]["book"] 

print(books[0]["title"]) # The Cathedral & the Bazaar: Musings on Linux and Open Source by an Accidental Revolutionary

0
投票

我正在为我的大学毕业项目构建一个应用程序。

我需要使用OAuth获取用户的goodreads数据,以及书籍的评级等。

我怎样才能做到这一点?我可以获得遗留 api 或仅用于我的项目的 api,教授坚持要求我找到一种方法来做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.