请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 76772|回复: 111

【Python 第45课】 查天气(3)

[复制链接]

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-7-24 16:47:29 |显示全部楼层
python 查天气系列:
【Python 第43课】 查天气(1) http://bbs.crossincode.com/forum.php?mod=viewthread&tid=8
【Python 第44课】 查天气(2) http://bbs.crossincode.com/forum.php?mod=viewthread&tid=9
【Python 第45课】 查天气(3) http://bbs.crossincode.com/forum.php?mod=viewthread&tid=12
【Python 第46课】 查天气(4) http://bbs.crossincode.com/forum.php?mod=viewthread&tid=42

看一下我们已经拿到的json格式的天气数据:
  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. }
复制代码
直接在命令行中看到的应该是没有换行和空格的一长串字符,这里我把格式整理了一下。可以看出,它像是一个字典的结构,但是有两层。最外层只有一个key--“weatherinfo”,它的value是另一个字典,里面包含了好几项天气信息,现在我们最关心的就是其中的temp1,temp2和weather。

虽然看上去像字典,但它对于程序来说,仍然是一个字符串,只不过是一个满足json格式的字符串。我们用python中提供的另一个模块json提供的loads方法,把它转成一个真正的字典。
  1. import json

  2. data = json.loads(content)
复制代码
这时候的data已经是一个字典,尽管在控制台中输出它,看上去和content没什么区别,只是编码上有些不同:
  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)
复制代码
就知道区别在哪里了。

之后的事情就比较容易了。
  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 '没有找到该城市'
复制代码
45.png


完整代码:
  1. # -*- coding: utf-8 -*-
  2. import urllib2
  3. import json
  4. from city import city

  5. cityname = raw_input('你想查哪个城市的天气?\n')
  6. citycode = city.get(cityname)
  7. if citycode:
  8.     try:
  9.         url = ('http://www.weather.com.cn/data/cityinfo/%s.html'
  10.                % citycode)
  11.         content = urllib2.urlopen(url).read()
  12.         data = json.loads(content)
  13.         result = data['weatherinfo']
  14.         str_temp = ('%s\n%s ~ %s') % (
  15.             result['weather'],
  16.             result['temp1'],
  17.             result['temp2']
  18.         )
  19.         print str_temp
  20.     except:
  21.         print '查询失败'
  22. else:
  23.     print '没有找到该城市'
复制代码
#==== Crossin的编程教室 ====#
微信ID:crossincode
QQ群:312723402

面向零基础初学者的编程课
每天5分钟,轻松学编程


#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

7

主题

1

好友

269

积分

中级会员

Rank: 3Rank: 3

发表于 2013-7-24 19:24:05 |显示全部楼层

回帖奖励 +1

Cool

限制字节。。。
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-7-24 19:28:29 |显示全部楼层
byron 发表于 2013-7-24 19:24
Cool

限制字节。。。

嗯,去掉限制了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

1

好友

80

积分

注册会员

Rank: 2

发表于 2013-7-24 21:44:10 |显示全部楼层
来了
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-7-24 21:47:28 |显示全部楼层
浮生湮灭了美好 发表于 2013-7-24 21:44
来了

#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

6

积分

新手上路

Rank: 1

发表于 2013-7-24 22:25:33 |显示全部楼层
来顶一顶!
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-7-24 23:02:56 |显示全部楼层
jeeyoo 发表于 2013-7-24 22:25
来顶一顶!

#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

36

积分

新手上路

Rank: 1

发表于 2013-7-24 23:28:02 |显示全部楼层
论坛还没有人气
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-7-24 23:43:36 |显示全部楼层
feicien 发表于 2013-7-24 23:28
论坛还没有人气

嗯,昨天刚刚小范围公布,还没多少人来。人气还要靠大家
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

32

积分

新手上路

Rank: 1

发表于 2013-7-25 11:02:39 |显示全部楼层
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
现在反而查询不到了!试了一下是在datas=json.loads(content)出得错,从命令行试了一下报上面的错误!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-3-29 18:25 , Processed in 0.037254 second(s), 28 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部