2016-08-28 11 views
-1

次の単純なスニペットコードを使用してJSONオブジェクトをインポートし、特定のフィールドをリストに引き出します。ここでは、次のとおりです。Python jsonキーエラー

#Set Observations URL request for all observations within the Osa Pennisula, Costa Rica 
query = urllib2.urlopen("http://api.inaturalist.org/v1/observations?nelat=8.60586&nelng=-83.44410&swlat=8.43066&swlng=-83.74073&per_page=1000&order=desc&order_by=created_at") 
obSet = json.load(query) 

#Find all common names for observations 


for item in obSet['results']: 
    print item['taxon']['preferred_common_name'] 

URLはiNaturalist node.jsサービスへの呼び出しです。私は電話をかけるとき、私は次のような結果を得る:

Red Brocket 
Gumbo Limbo 
Northern Tamandua 
Colubrids 
Bats 
Skippers 
True Toads 
Crested Owl 
Tropical Screech-Owl 
White-nosed Coati 
Central American Squirrel Monkey 
Thread-legged Bugs 
Roadside Hawk 
Barn Owl 
Red Land Crab 
Crested Caracar 

--------------------------------------------------------------------------- 
KeyError         Traceback (most recent call last) 
<ipython-input-255-6e709d365b1b> in <module>() 
    3 
    4 for item in obSet['results']: 
    ----> 5  print item['taxon']['preferred_common_name'] 
    6 
    7 

KeyError: 'preferred_common_name' 

をだから、奇妙だ - 私は、レスポンスが304の結果を持っていることを知っているが、コードは数をプリントアウトしてから爆破するようです。どうしてこれなの?!

答えて

2

obSet['results']のすべての項目にキーitem['taxon']['preferred_common_name']が含まれているわけではありません。

これらをキャッチして攻撃キーを印刷することで、それに対抗することができます。あなたにもこれらをキャッチすることもできますので、いくつかの項目は、'taxon'キーの値としてNoneを持っているようにそれはまたようだ:

for item in obSet['results']: 
    try: 
      print item['taxon']['preferred_common_name'] 
    except (KeyError, TypeError): 
      print item 
+0

OK - 私はこれが彼らの問題を解決したとして、上述の質問に編集内容を追加しました! –

+0

@AnthonyW私の更新された答えを見て、それは両方のあなたの問題を解決します。 – DeepSpace

+0

はいそうです。ありがとう! –