AmazonAPIから取得したjsonファイルの情報の抽出をしようとしています。
jsonファイルは、商品によって要素(商品サイズ等)がある場合とない場合が分かれています。
要素が無いときに、KeyErrorが発生したため、try-exceptで例外処理していますが、抽出する要素数が各商品20種類と多いためコードが長くなっています。
KeyErrorで検索して、「.get()で取得すれば要素が無いときはKeyErrorが出ない」と理解したのですが、.get()で要素を抽出しても、間の[0]で要素が見つからず、IndexErrorが発生してしまいます。
example:
json_a.get("a")[0].get("b").get("c")
IndexErrorを例外処理するかKeyErrorを例外処理するかの違いだけでした。
【質問】
要素があったりなかったりする場合、jsonからの要素の抽出は一つ一つ例外処理を書いていくしかないのでしょうか?
【変更点】
ソースコードとjsonを追記しました。
json例
json
response_json = { "asin": "B0872MYW83", "identifiers": [ { "marketplaceId": "A1VC38T7YXB528", "identifiers": [ { "identifier": "4902777309934", "identifierType": "EAN" } ] } ], ・・・中略 "summaries": [ { "marketplaceId": "A1VC38T7YXB528", "brandName": "NEXT BODY(\u30cd\u30af\u30b9\u30c8 \u30dc\u30c7\u30a3)", "browseNode": "3457072051", "itemName": "[Amazon\u9650\u5b9a\u30d6\u30e9\u30f3\u30c9] \u660e\u6cbb \u30b6\u30d0\u30b9(SAVAS) \u30db\u30a8\u30a4\u30d7\u30ed\u30c6\u30a4\u30f3 \u30b3\u30b3\u30a2\u5473\u301051\u98df\u5206\u3011 1,071g NEXT BODY", "manufacturer": "\u660e\u6cbb", "modelNumber": "2630993", "sizeName": "1.071\u30ad\u30ed\u30b0\u30e9\u30e0 (x 1)" } ], "variations": [] }
プログラム
Python
json_tmp = json.loads(response_json) try: jan = json_tmp.get('identifiers')[0].get('identifiers')[0].get('identifier') except (IndexError,AttributeError): jan = '' try: major_rank = json_tmp.get('ranks')[0].get('ranks')[0].get('rank') except (IndexError,AttributeError): major_rank = '' try: minor_rank = json_tmp.get('ranks')[0].get('ranks')[1].get('rank') except (IndexError,AttributeError): minor_rank = '' try: junre = json_tmp.get('ranks')[0].get('ranks')[0].get('title') except (IndexError,AttributeError): junre = '' try: item_name = json_tmp.get('summaries')[0].get('itemName') except (IndexError,AttributeError): item_name = '' try: brand_name = json_tmp.get('summaries')[0].get('brandName') except (IndexError,AttributeError): brand_name = '' try: manufacturer = json_tmp.get('summaries')[0].get('manufacturer') except (IndexError,AttributeError): manufacturer = '' try: model_number = json_tmp.get('summaries')[0].get('modelNumber') except (IndexError,AttributeError): model_number = '' try: valiations = json_tmp.get('variations') except (IndexError,AttributeError): valiations = ''
まだ回答がついていません
会員登録して回答してみよう