gpt4 book ai didi

python - 使用 Python 和 Flask 制作应用程序时出现 `json.decoder.JSONDecodeError`

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:11 25 4
gpt4 key购买 nike

我在使用 Flask 构建应用程序时尝试使用 Goodread 的 api 获取一本书的评论数据。这是我在名为 CS50 Web 编程系列的教程系列中所做的项目的一部分。

所以我一直在尝试使用 Python 的 Request 来拉取数据模块并将该数据存储在一个变量中,然后对其进行 Jsonify。这样当用户输入 /api/<a book's isbn number> 时那么它应该返回一本书的 Jsonified 数据。

@app.route('/api/<isbn>', methods = ['GET'])
def isbn(isbn):
#import api from Goodreads (stats)
r = requests.get("https://www.goodreads.com/book/review_counts.json", params={"key": "L3FHyOR3IhCo3kctcUz3zg", "isbns": "isbn"}).json()
res = db.execute("SELECT * FROM books WHERE isbn = :isbn", {"isbn": isbn}).fetchone()
print ('res')
if res is None:
return "404 error"
return jsonify({
"title": res.title,
"author": res.author,
"year": res.year,
"isbn": res.isbn,
"review_count": r.reviews_count,
"average_score": r.average_rating
})

我在输入 isbn 时遇到的错误如下所示。 http://prntscr.com/ojnwbw

看来,我在定义 r 的行上提出了一个重大问题。 .谁能帮忙解决这个问题?

最佳答案

删除“isbn”周围的引号:

不好:

>>> requests.get('https://www.goodreads.com/book/review_counts.json', params={"key": "[MY_API_KEY]", "isbns": "isbn"}).json()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.6/site-packages/requests/models.py", line 897, in json
return complexjson.loads(self.text, **kwargs)
File "/usr/lib64/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/usr/lib64/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/python3.6/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

很好,发送变量的值而不是变量:

>>> isbn="0441172717"
>>> requests.get('https://www.goodreads.com/book/review_counts.json', params={"key": "[MY_API_KEY]", "isbns": isbn}).json()
{'books': [{'id': 47173379, 'isbn': '0441172717', 'isbn13': '9780441172719', 'ratings_count': 3, 'reviews_count': 8, 'text_reviews_count': 0, 'work_ratings_count': 625868, 'work_reviews_count': 1034615, 'work_text_reviews_count': 17000, 'average_rating': '4.22'}]}

更好:

...
r = requests.get("https://www.goodreads.com/book/review_counts.json", params={"key": "[MY_API_KEY]", "isbns": isbn})
if r.status_code != 200:
raise ValueError
...

最好:首先检查 isbn 的有效性,然后将 db.execute() 放在首位。如果您的数据库没有结果,为什么还要去 goodreads.com 呢?除非,您指望 goodreads.com 确保用户输入正确并保护您免受注入(inject)...?

接下来,不要在公共(public)问题中使用您的真实 API key ;)

最后,如果出现错误,requests.get(...).json() 将无法工作:

>>> requests.get('https://www.goodreads.com/book/review_counts.json')
<Response [422]>

来自 goodreads.com/api:“您可以混合使用 ISBN10 和 ISBN13,但是如果您没有指定任何内容,您将收到 422 错误,如果找不到任何内容,您将收到 404。”您发送的是“isbns=isbn”,即没有真正有效的 isbn。

希望这对您有所帮助!

根据您的进一步评论回答您的问题:

将上面的响应重新格式化为“漂亮的 JSON”(谷歌 JSON 查看器,用于复制+粘贴 JSON 字符串以进行美化的在线方式)我们看到:

{  
'books':[
{
'id':47173379,
'isbn':'0441172717',
'isbn13':'9780441172719',
'ratings_count':3,
'reviews_count':8,
'text_reviews_count':0,
'work_ratings_count':625902,
'work_reviews_count':1034690,
'work_text_reviews_count':17002,
'average_rating':'4.22'
}
]
}

您现在可以看到响应是一个 Dict(Response)->Array(books)->Dicts so..

>>> r = requests.get('https://www.goodreads.com/book/review_counts.json', params={"key": "L3FHyOR3IhCo3kctcUz3zg", "isbns": isbn}).json()
>>> print(r)
{'books': [{'id': 47173379, 'isbn': '0441172717', 'isbn13': '9780441172719', 'ratings_count': 3, 'reviews_count': 8, 'text_reviews_count': 0, 'work_ratings_count': 625905, 'work_reviews_count': 1034694, 'work_text_reviews_count': 17002, 'average_rating': '4.22'}]}
>>> print(r['books'])
[{'id': 47173379, 'isbn': '0441172717', 'isbn13': '9780441172719', 'ratings_count': 3, 'reviews_count': 8, 'text_reviews_count': 0, 'work_ratings_count': 625905, 'work_reviews_count': 1034694, 'work_text_reviews_count': 17002, 'average_rating': '4.22'}]
>>> print(r['books'][0])
{'id': 47173379, 'isbn': '0441172717', 'isbn13': '9780441172719', 'ratings_count': 3, 'reviews_count': 8, 'text_reviews_count': 0, 'work_ratings_count': 625905, 'work_reviews_count': 1034694, 'work_text_reviews_count': 17002, 'average_rating': '4.22'}
>>> print(r['books'][0]['reviews_count'])
8

因此,您对属性错误的回答是使用:“r['books'][0]['reviews_count']”而不是“r.reviews_count”以及“r['books'][0] ['??????']"任何其他属性的格式。您还可以通过格式“########,########,########,...”处理多个 ISBN,并根据API。

关于python - 使用 Python 和 Flask 制作应用程序时出现 `json.decoder.JSONDecodeError`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57192919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com