如何将JSON特定部分保存为变量?

ubby3x7f  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(190)

我使用一个API来获取漫画封面,为此我需要将Json响应的一部分保存为变量。

import requests
import json

title = "prison-school"

base_url = "https://api.mangadex.org"

r = requests.get(
    f"{base_url}/manga",
    params={"title": title}
)

lol  = [manga["id"] for manga in r.json()["data"]]
idManga = lol[0]

r2 = requests.get(
    f"{base_url}/manga/{idManga}?includes[]=cover_art"
)

lol2  = r2.json()

lol3 = json.dumps(lol2)





print(lol3)

这给了我一个响应:

{"result": "ok", "response": "entity", "data": {"id": "371a7405-bee1-402c-b0d7-74ea3fb4d587", "type": "manga", "attributes": {"title": {"en": "Prison School"}, "altTitles": [{"ja-ro": "Kangoku Gakuen"}, {"id": "Penjara Di Sekolah"}, {"ru": "\u0428\u043a\u043e\u043b\u0430-\u0422\u044e\u0440\u044c\u043c\u0430"}, {"ja": "\u30d7\u30ea\u30ba\u30f3\u30b9\u30af\u30fc\u30eb"}, {"zh-hk": "\u76e3\u7344\u5b66\u5712"}], "description": {"en": "Hachimitsu Academy, known for its strict academic standards and even stricter school code, is making a giant change this year. In the first time in school history, they are allowing boys to be admitted. As Fujino Kiyoshi starts his first day at Hachimitsu Academy he is shocked to find out that there are only 4 other guys in the entire school, making the ratio of girls to boys 200:1. And to their dismay, not one of the thousand girls will talk to them or even acknowledge them. But Kiyoshi and the guys are about to find out about the shadow student council that has been threatening the female students about interacting with male students  \n\n\n---", "ru": "\u0427\u0430\u0441\u0442\u043d\u0430\u044f \u0416\u0435\u043d\u0441\u043a\u0430\u044f \u0410\u043a\u0430\u0434\u0435\u043c\u0438\u044f \u0425\u0430\u0447\u0438\u043c\u0438\u0442\u0441\u0443 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u0433\u0438\u043c\u0438 \u0430\u043a\u0430\u0434\u0435\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0442\u0440\u043e\u0433\u0438\u043c\u0438 \u0448\u043a\u043e\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438. \u0412\u043f\u0435\u0440\u0432\u044b\u0435, \u0437\u0430 \u0432\u0441\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u043a\u043e\u043b\u044b, \u043c\u0430\u043b\u044c\u0447\u0438\u043a\u0438 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043a \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044e \u0432 \u044d\u0442\u0443 \u0430\u043a\u0430\u0434\u0435\u043c\u0438\u044e. \u0424\u0443\u0434\u0436\u0438\u043d\u043e \u041a\u0438\u0451\u0448\u0438 \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0443\u0447\u0435\u0431\u043d\u044b\u0439 \u0434\u0435\u043d\u044c \u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u043d\u044b\u0439 \u0448\u043e\u043a, \u0443\u0437\u043d\u0430\u0432, \u0447\u0442\u043e \u0432 \u0430\u043a\u0430\u0434\u0435\u043c\u0438\u044e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e 5 \u043f\u0430\u0440\u043d\u0435\u0439, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0447\u0435\u0433\u043e \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0434\u0435\u0432\u0443\u0448\u0435\u043a \u0438 \u043f\u0430\u0440\u043d\u0435\u0439 - 200:1. \u041f\u0430\u0440\u043d\u0438, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0432 \u043c\u0430\u043b\u0438\u043d\u0435. \u041d\u043e \u043d\u0435 \u0442\u0443\u0442-\u0442\u043e \u0431\u044b\u043b\u043e. \u041a \u0438\u0445 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c\u0443 \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0438 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u044b\u0441\u044f\u0447\u0438 \u0434\u0435\u0432\u0443\u0448\u0435\u043a \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0441 \u043d\u0438\u043c\u0438 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u043a \u0441\u0432\u043e\u0438\u0445 \u0441\u043e\u043a\u0443\u0440\u0441\u043d\u0438\u043a\u043e\u0432. \u041a\u0438\u0451\u0448\u0438 \u0438 \u043f\u0430\u0440\u043d\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u043b\u0430\u0447\u0438\u0442\u044c \u041f\u043e\u0434\u043f\u043e\u043b\u044c\u043d\u044b\u0439 \u0421\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0439 \u0421\u043e\u0432\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0433\u0440\u043e\u0436\u0430\u0435\u0442 \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043a\u0430\u043c \u0425\u0430\u0447\u0438\u043c\u0438\u0442\u0441\u0443.  \n  \nWon the Kodansha Manga Award 2013 for best general manga."}, "isLocked": false, "links": {"al": "55297", "ap": "prison-school", "bw": "series/4390", "kt": "18452", "mu": "63043", "amz": "https://www.amazon.co.jp/gp/product/B077JMRFL3", "ebj": "https://ebookjapan.yahoo.co.jp/books/141809/", "mal": "25297", "raw": "https://comic-days.com/episode/10834108156629480592", "engtl": "https://yenpress.com/9781975330248/prison-school-vol-28/"}, "originalLanguage": "ja", "lastVolume": "28", "lastChapter": "277", "publicationDemographic": "seinen", "status": "completed", "year": 2011, "contentRating": "suggestive", "tags": [{"id": "0a39b5a1-b235-4886-a747-1d05d216532d", "type": "tag", "attributes": {"name": {"en": "Award Winning"}, "description": {}, "group": "format", "version": 1}, "relationships": []}, {"id": "423e2eae-a7a2-4a8b-ac03-a8351462d71d", "type": "tag", "attributes": {"name": {"en": "Romance"}, "description": {}, "group": "genre", "version": 1}, "relationships": []}, {"id": "4d32cc48-9f00-4cca-9b5a-a839f0764984", "type": "tag", "attributes": {"name": {"en": "Comedy"}, "description": {}, "group": "genre", "version": 1}, "relationships": []}, {"id": "caaa44eb-cd40-4177-b930-79d3ef2afe87", "type": "tag", "attributes": {"name": {"en": "School Life"}, "description": {}, "group": "theme", "version": 1}, "relationships": []}], "state": "published", "chapterNumbersResetOnNewVolume": false, "createdAt": "2018-02-07T22:21:15+00:00", "updatedAt": "2022-02-15T22:29:07+00:00", "version": 7, "availableTranslatedLanguages": ["es", "ru", "pl", "en", "ar", "fa"], "latestUploadedChapter": "835c358c-7844-452c-bb09-4b6fc6e42c4d"}, "relationships": [{"id": "bb7c8f8b-f82d-4a73-9f87-02713ca82722", "type": "author"}, {"id": "bb7c8f8b-f82d-4a73-9f87-02713ca82722", "type": "artist"}, {"id": "416e58a6-ac84-4f50-92e0-aac6636a2bca", "type": "cover_art", "attributes": {"description": "", "volume": null, "fileName": "e039f18a-eb05-43d1-ac68-598aa09da9c2.jpg", "locale": "ja", "createdAt": "2021-05-24T16:39:34+00:00", "updatedAt": "2021-05-24T16:39:34+00:00", "version": 1}}, {"id": "0924201b-89b1-4a07-82aa-f504eb67d509", "type": "manga", "related": "doujinshi"}, {"id": "1db29ef5-1231-47df-b6a4-3e25182b341c", "type": "manga", "related": "doujinshi"}, {"id": "985f8295-978d-48d4-bc43-4b035e527f77", "type": "manga", "related": "spin_off"}, {"id": "e9fcd6db-1ba2-4140-9813-9028a996ff7c", "type": "manga", "related": "side_story"}]}}

我需要将“文件名”保存为变量,但每次我这样做

filename = lol3['filename']

我得到这个错误:

string indices must be integers
jm81lzqq

jm81lzqq1#

尝试运行filename = lol2['filename']
通过使用json.dumps,您可以将字典重新转换为json字符串。
要保留json格式,请将其保留为字典并访问以下键:

import requests
import json

title = "prison-school"

base_url = "https://api.mangadex.org"

r = requests.get(
    f"{base_url}/manga",
    params={"title": title}
)

lol  = [manga["id"] for manga in r.json()["data"]]
idManga = lol[0]

r2 = requests.get(
    f"{base_url}/manga/{idManga}?includes[]=cover_art"
)

lol2  = r2.json()
print(lol2)
63lcw9qa

63lcw9qa2#

唯一的fileName键在JSON响应中嵌套很深。

import requests

base_url = "https://api.mangadex.org/manga"

(r := requests.get(base_url, params={'title': 'prison-school'})).raise_for_status()

for datum in r.json()['data']:
    (r := requests.get(f"{base_url}/{datum['id']}", params={'includes[]': 'cover_art'})).raise_for_status()
    for rel in r.json()['data'].get('relationships', []):
        if attr := rel.get('attributes'):
            if filename := attr.get('fileName'):
                print(filename)

输出:

e039f18a-eb05-43d1-ac68-598aa09da9c2.jpg
65045cd1-49e3-4594-9d8d-2cc5556a24c9.jpg
543acfb3-032f-49a5-bbde-4d4d04cbadc5.jpg

相关问题