看一下我們已經(jīng)拿到的json格式的天氣數(shù)據(jù):
1. {
2. "weatherinfo": {
3. "city": "南京",
4. "cityid": "101190101",
5. "temp1": "37℃",
6. "temp2": "28℃",
7. "weather": "多云",
8. "img1": "d1.gif",
9. "img2": "n1.gif",
10. "ptime": "11:00"
11. }
12. }
復制代碼
直接在命令行中看到的應該是沒有換行和空格的一長串字符,這里我把格式整理了一下??梢钥闯?,它像是一個字典的結(jié)構(gòu),但是有兩層。最外層只有一個key--“weatherinfo”,它的value是另一個字典,里面包含了好幾項天氣信息,現(xiàn)在我們最關(guān)心的就是其中的temp1,temp2和weather。
雖然看上去像字典,但它對于程序來說,仍然是一個字符串,只不過是一個滿足json格式的字符串。我們用python中提供的另一個模塊json提供的loads方法,把它轉(zhuǎn)成一個真正的字典。
1. import json
2.
3. data = json.loads(content)
復制代碼
這時候的data已經(jīng)是一個字典,盡管在控制臺中輸出它,看上去和content沒什么區(qū)別,只是編碼上有些不同:
1. {u'weatherinfo': {u'city':u'\u5357\u4eac', u'ptime': u'11:00', u'cityid': u'101190101',u'temp2': u'28\u2103', u'temp1': u'37\u2103', u'weather':u'\u591a\u4e91', u'img2': u'n1.gif', u'img1': u'd1.gif'}}
復制代碼
但如果你用type方法看一下它們的類型:
1. print type(content)
2. print type(data)
3.
復制代碼
就知道區(qū)別在哪里了。
之后的事情就比較容易了。
1. result =data['weatherinfo']
2. str_temp = ('%s\n%s ~ %s') %(
3. result['weather'],
4. result['temp1'],
5. result['temp2']
6. )
7. print str_temp
復制代碼
為了防止在請求過程中出錯,我加上了一個異常處理。
1. try:
2. ###
3. ###
4. except:
5. print '查詢失敗'
復制代碼
以及沒有找到城市時的處理:
1. if citycode:
2. ###
3. ###
4. else:
5. print '沒有找到該城市'
復制代碼
完整代碼:
1. # -*- coding: utf-8 -*-
2. import urllib2
3. import json
4. from city import city
5.
6. cityname =raw_input('你想查哪個城市的天氣?\n')
7. citycode =city.get(cityname)
8. if citycode:
9. try:
10. url =('http://www.weather.com.cn/data/cityinfo/%s.html'
11. % citycode)
12. content = urllib2.urlopen(url).read()
13. data = json.loads(content)
14. result = data['weatherinfo']
15. str_temp = ('%s\n%s ~ %s') % (
16. result['weather'],
17. result['temp1'],
18. result['temp2']
19. )
20. print str_temp
21. except:
22. print '查詢失敗'
23. else:
24. print '沒有找到該城市'