json 파싱 코드 에러 질문입니다.
https://pubchem.ncbi.nlm.nih.gov/rest/pug_view/annotations/heading/json?heading=Acid%20Value
위에 보기 불편 하시면
http://jsoneditoronline.org/#left=local.hacowe&right=local.vexezi
여기에 붙여 넣어주시면 됩니다.
여기에서 CID 값을 얻고 싶은데
=========================================================================
import requests
import json
host = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug_view'
path = '/annotations/heading/json?heading=Acid%20Value'
url = host + path
a = requests.get(url)b = a.json()
for data in b["Annotations"]["Annotation"]:
print(data["LinkedRecords"][0]["CID"][0])
============================================================================
위 코드를 돌리면
KeyError: 'LinkedRecords'
에러가 뜹니다.
어떻게 해야할까요?
데이터를 확인해보면 일부 데이터는 LinkedRecords 가 없기 때문에 발생합니다.
예) 제일 앞의 데이터
{ "SourceName":"EU Food Improvement Agents", "SourceID":"E 322 LECITHINS", "Name":"LECITHINS", "Description":"Commission Regulation (EU) No 231/2012 of 9 March 2012 laying down specifications for food additives listed in Annexes II and III to Regulation (EC) No 1333/2008 of the European Parliament and of the Council Text with EEA relevance", "URL":"https://eur-lex.europa.eu/legal-content/EN/ALL/?uri=CELEX%3A32012R0231", "Data":[ { "TOCHeading":{ "type":"Compound", "#TOCHeading":"Acid Value" }, "Value":{ "StringWithMarkup":[ { "String":"Lecithins: not more than 35 mg of potassium hydroxide per gram; Hydrolysed lecithins: not more than 45 mg of potassium hydroxide per gram" } ] } } ] }따라서 없는 경우에는 출력을 건너띄도록 수정하시면 됩니다.
dictionary 안에 해당하는 Key 가 있는지 확인 하는 방법에는 if 조건문이나 try-except를 사용할 수 있습니다.
또한 LinkedRecords 아래에 바로 CID가 존재하기에
"LinkedRecords":{ "CID":[ 443314 ] }
data["LinkedRecords"][0]["CID"] 가 아닌 data["LinkedRecords"]["CID"] 으로 CID를 접근해야 합니다.아래는 if "key" in dictionary: 를 사용한 예시입니다.
또한 CID의 경우 리스트라서 [0]을 제거했습니다.
import requests import json host = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug_view' path = '/annotations/heading/json?heading=Acid%20Value' url = host + path a = requests.get(url) b = a.json() # print(b["Annotations"]["Annotation"]) for data in b["Annotations"]["Annotation"]: if "LinkedRecords" in data: print(data["LinkedRecords"]["CID"])
만약 첫 CID 만 필요한 경우에는 원래대로 [0]을 넣으면 됩니다.안녕하세요
샘플 소스입니다. 참고하세요~
import requests host = 'https://pubchem.ncbi.nlm.nih.gov/rest/pug_view' path = '/annotations/heading/json?heading=Acid%20Value' url = host + path response = requests.get(url) json = response.json(); for data in json['Annotations']['Annotation']: linkedRecords = data.get('LinkedRecords') if linkedRecords == None: continue print('CID :', linkedRecords['CID'][0])