2013-04-21 67 views
33

Tôi nhận được thông tin thời tiết từ một URL.Truy cập các phần tử JSON

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

và những gì tôi nhận được là:

{ 
    "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" 
    }]   
} 
} 

Làm thế nào tôi có thể truy cập vào bất kỳ yếu tố mà tôi muốn?

nếu tôi làm: print wjson['data']['current_condition']['temp_C'] Tôi nhận lỗi nói:

chỉ số chuỗi phải là số nguyên, không str.

+1

'requests' là một cách tuyệt vời để có được cùng với JSON..If bạn đang xử lý phức tạp URL của .. sử dụng nó. – Surya

Trả lời

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

Những gì bạn nhận được từ url là chuỗi json. Và bạn không thể phân tích cú pháp nó với chỉ mục một cách trực tiếp. Bạn nên chuyển đổi nó thành một dict bằng json.loads và sau đó bạn có thể phân tích cú pháp nó bằng chỉ mục.

Thay vì sử dụng .read() để intermediately lưu nó vào bộ nhớ và sau đó đọc nó để json, cho phép json để tải trực tiếp từ file:

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

tuyệt vời, hiện đang hoạt động. bạn có thể giải thích cho tôi lý do tại sao điều này? – doniyor

+0

Yarkee đã giải thích @doniyor. Đó là bởi vì nó được chuyển đổi thành một dict bằng cách sử dụng 'json.loads()'. Bạn chỉ đang cố gắng truy cập trực tiếp JSON ... mà không cần chuyển đổi thành bất kỳ điều gì có thể đọc được bằng Python hoặc sử dụng một mô-đun để làm như vậy. – Ben

+3

Làm tốt hơn 'json.load (urllib2.urlopen ('url'))' vì vậy nó tải nó trực tiếp thay vì trung gian lưu nó vào bộ nhớ – jamylak

19

Dưới đây là một giải pháp thay thế sử dụng requests:

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

Có cách nào để trả lại điều này mà không biết chỉ mục, giả sử có nhiều mục nhập điều kiện hiện tại không? – user2019182

3

'temp_C' là khóa trong từ điển nằm trong danh sách nằm trong từ điển

.210

Bằng cách này hoạt động:

wjson['data']['current_condition'][0]['temp_C'] 
>> '10' 
Các vấn đề liên quan