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
1response_json = 2 { 3 "asin": "B0872MYW83", 4 "identifiers": [ 5 { 6 "marketplaceId": "A1VC38T7YXB528", 7 "identifiers": [ 8 { 9 "identifier": "4902777309934", 10 "identifierType": "EAN" 11 } 12 ] 13 } 14 ], 15 ・・・中略 16 "summaries": [ 17 { 18 "marketplaceId": "A1VC38T7YXB528", 19 "brandName": "NEXT BODY(\u30cd\u30af\u30b9\u30c8 \u30dc\u30c7\u30a3)", 20 "browseNode": "3457072051", 21 "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", 22 "manufacturer": "\u660e\u6cbb", 23 "modelNumber": "2630993", 24 "sizeName": "1.071\u30ad\u30ed\u30b0\u30e9\u30e0 (x 1)" 25 } 26 ], 27 "variations": [] 28}
プログラム
Python
1json_tmp = json.loads(response_json) 2 3 try: 4 jan = json_tmp.get('identifiers')[0].get('identifiers')[0].get('identifier') 5 except (IndexError,AttributeError): 6 jan = '' 7 try: 8 major_rank = json_tmp.get('ranks')[0].get('ranks')[0].get('rank') 9 except (IndexError,AttributeError): 10 major_rank = '' 11 try: 12 minor_rank = json_tmp.get('ranks')[0].get('ranks')[1].get('rank') 13 except (IndexError,AttributeError): 14 minor_rank = '' 15 try: 16 junre = json_tmp.get('ranks')[0].get('ranks')[0].get('title') 17 except (IndexError,AttributeError): 18 junre = '' 19 try: 20 item_name = json_tmp.get('summaries')[0].get('itemName') 21 except (IndexError,AttributeError): 22 item_name = '' 23 try: 24 brand_name = json_tmp.get('summaries')[0].get('brandName') 25 except (IndexError,AttributeError): 26 brand_name = '' 27 try: 28 manufacturer = json_tmp.get('summaries')[0].get('manufacturer') 29 except (IndexError,AttributeError): 30 manufacturer = '' 31 try: 32 model_number = json_tmp.get('summaries')[0].get('modelNumber') 33 except (IndexError,AttributeError): 34 model_number = '' 35 try: 36 valiations = json_tmp.get('variations') 37 except (IndexError,AttributeError): 38 valiations = ''
回答2件
あなたの回答
tips
プレビュー