2013-04-21 13 views
33

URLから天気情報を取得しています。JSON要素へのアクセス

weather = urllib2.urlopen('url') 
wjson = weather.read() 

と私は取得していますが次のとおりです。

{ 
    "data": { 
    "current_condition": [{ 
     "cloudcover": "0", 
     "humidity": "54", 
     "observation_time": "08:49 AM", 
     "precipMM": "0.0", 
     "pressure": "1025", 
     "temp_C": "10", 
     "temp_F": "50", 
     "visibility": "10", 
     "weatherCode": "113", 
     "weatherDesc": [{ 
      "value": "Sunny" 
     }], 
     "weatherIconUrl": [{ 
      "value": "http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0001_sunny.png" 
     }], 
     "winddir16Point": "E", 
     "winddirDegree": "100", 
     "windspeedKmph": "22", 
     "windspeedMiles": "14" 
    }]   
} 
} 

は、どのように私は私が望む任意の要素にアクセスすることができますか?

私がしなければ

文字列のインデックスがstrのない、整数でなければなりません:print wjson['data']['current_condition']['temp_C']は、私が言ってエラーを取得しています。あなたは、URLから何を得る

+1

'requests'はJSONと仲良くする素晴らしい方法です。複雑なURLを扱っているのなら、それを使用してください。 – Surya

答えて

59
import json 
weather = urllib2.urlopen('url') 
wjson = weather.read() 
wjdata = json.loads(wjson) 
print wjdata['data']['current_condition'][0]['temp_C'] 

はJSON文字列です。そして、あなたはインデックスでそれを直接解析することはできません。 json.loadsでdictに変換してから、indexで解析できます。代わりに、中間メモリに保存し、その後jsonにそれを読んで、jsonをファイルから直接読み込むことができるように.read()を使用しての

wjdata = json.load(urllib2.urlopen('url')) 
+1

クール、それは今働いています。なぜこれが私に説明できますか? – doniyor

+0

Yarkeeはすでに@doniyorについて説明しています。 'json.loads()'を使ってdictに変換されているからです。あなたはJSONに直接アクセスしようとしているだけです... Pythonで読めるものに変換することも、モジュールを使って変換することもありません。 – Ben

+3

'json.load(urllib2.urlopen( 'url'))'を実行すると、すぐにメモリに保存されるのではなく、直接ロードされます。 – jamylak

19

ここrequestsを使用して、代替ソリューションです:

import requests 
wjdata = requests.get('url').json() 
print wjdata['data']['current_condition'][0]['temp_C'] 
+0

現在の条件エントリがさらに多いと仮定して、インデックスを知らずにこれを返す方法はありますか? – user2019182

3

'temp_C'は、辞書内にある辞書内のキーです。

このように動作します:

wjson['data']['current_condition'][0]['temp_C'] 
>> '10' 
関連する問題