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

Crossin的编程教室

 找回密码
 立即加入
查看: 135209|回复: 259

【Python 第44课】 查天气(2)

  [复制链接]

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-7-23 21:33:14 |显示全部楼层
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

先来看python中的urllib2,这是python中一个用来获取网络资源的模块。我们平常上网,在浏览器地址栏中输入一个网址,浏览器根据这个网址拿到一些内容,然后展现在页面上,这大约就是浏览网页的过程。类似的,urllib2会跟据你提供的网址,请求对应的内容。

打开一个链接和打开一个文件有点像:
  1. import urllib2
  2. web = urllib2.urlopen('http://www.baidu.com')
  3. content = web.read()
  4. print content
复制代码
我们引入urllib2的模块,用其中的urlopen方法打开百度,然后用read方法把其中的内容读取到一个变量中并输出。运行后,你会看到控制台中输出了一堆看不懂的代码文字。这段代码中有html,有css,还有javascript。我们在浏览器中看到的网页大部分就是由这些代码所组成。如果你把content保存到一个以“.html”结尾的文件中(保存文件的方法前面已经说过很多),再打开这个html文件,就会看到“百度的首页”,只是这个首页在你的电脑上,所以你无法进行搜索。

回到我们的查天气程序,我们要向中国天气网发一个查询天气的请求。昨天说了,如何获取查询的url是个问题。先说简单的办法,用我提供的城市代码列表city.py。

city.py这个文件里有一个叫做city的字典,它里面的key是城市的名称,value是对应的城市代码。不用把它copy到自己的程序中,只要放在和你的代码同一路径下,用
  1. from city import city
复制代码
就可以引入city这个字典。这里相当于用了一个自定义的模块,前一个“city”是模块名,也就是py文件的名称,后一个“city”是模块中变量的名称。

构造我们需要的url:
  1. cityname = raw_input('你想查哪个城市的天气?\n')
  2. citycode = city.get(cityname)
  3. if citycode:
  4.    url = 'http://www.weather.com.cn/data/cityinfo/%s.html' % citycode
  5.    content = urllib2.urlopen(url).read()
复制代码
为了防止你输入列表中没有的城市,所以用了if判断citycode是否存在。

运行一下看看能不能得到结果。如果提示编码的错误,试试在文件最开始加上:
# -*- coding: utf-8 -*-

44weather.png


可以看到,已经拿到了json格式的天气信息。下一课再来处理它。

#==== Crossin的编程教室 ====#
微信ID:crossincode
QQ群:312723402

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


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

使用道具 举报

0

主题

0

好友

36

积分

新手上路

Rank: 1

发表于 2013-7-24 09:03:54 |显示全部楼层

回帖奖励 +1

  1. import urllib.request
  2. from city import city

  3. exit=False

  4. while not exit:
  5.     cityname=input("你想查询哪个城市的天气?输入q退出\n")
  6.     if cityname=="q" or cityname=="Q":
  7.         print("退出!")
  8.         exit=True
  9.     else:
  10.         citycode=city.get(cityname)
  11.         if citycode:
  12.             url=("http://www.weather.com.cn/data/cityinfo/%s.html"%citycode)
  13.             request=urllib.request.Request(url)
  14.             response=urllib.request.urlopen(request)
  15.             content=response.read().decode("utf-8")
  16.             print(content)
复制代码
回复

使用道具 举报

0

主题

0

好友

36

积分

新手上路

Rank: 1

发表于 2013-7-24 09:07:47 |显示全部楼层
feicien 发表于 2013-7-24 09:03

我下载的是python3.3
发现语法与python2.7有很大区别,这是我在python3.3下写的代码
加了一个while循环,下面是运行的结果:
  1. Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
  2. Type "copyright", "credits" or "license()" for more information.
  3. >>> ================================ RESTART ================================
  4. >>>
  5. 你想查询哪个城市的天气?输入q退出
  6. 北京
  7. {"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"36℃","temp2":"23℃","weather":"晴","img1":"d0.gif","img2":"n0.gif","ptime":"08:00"}}
  8. 你想查询哪个城市的天气?输入q退出
  9. 天津
  10. {"weatherinfo":{"city":"天津","cityid":"101030100","temp1":"36℃","temp2":"26℃","weather":"晴转多云","img1":"d0.gif","img2":"n1.gif","ptime":"08:00"}}
  11. 你想查询哪个城市的天气?输入q退出
  12. 上海、
  13. 你想查询哪个城市的天气?输入q退出
  14. 上海
  15. {"weatherinfo":{"city":"上海","cityid":"101020100","temp1":"39℃","temp2":"30℃","weather":"晴转多云","img1":"d0.gif","img2":"n1.gif","ptime":"08:00"}}
  16. 你想查询哪个城市的天气?输入q退出
  17. 杭州
  18. {"weatherinfo":{"city":"杭州","cityid":"101210101","temp1":"39℃","temp2":"29℃","weather":"晴","img1":"d0.gif","img2":"n0.gif","ptime":"08:00"}}
  19. 你想查询哪个城市的天气?输入q退出
  20. Q
  21. 退出!
  22. >>>
复制代码
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-7-24 10:27:33 |显示全部楼层
feicien 发表于 2013-7-24 09:03

很好啊
python 3 的同学看过来!
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

发表于 2013-7-24 23:28:37 |显示全部楼层
在mac下使用报错:
Traceback (most recent call last):
  File "weather.py", line 5, in <module>
    from city import city
  File "/Users/qinng/Code/Python/city.py", line 2
SyntaxError: Non-ASCII character '\xe5' in file /Users/qinng/Code/Python/city.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

在city.py文件前边也加一个 # -*- coding: UTF-8 -*-  就OK了。
回复

使用道具 举报

0

主题

0

好友

11

积分

新手上路

Rank: 1

发表于 2013-7-25 15:16:34 |显示全部楼层
很不错哦
回复

使用道具 举报

0

主题

0

好友

19

积分

新手上路

Rank: 1

发表于 2013-7-27 22:25:42 |显示全部楼层
下面的截图是什么软件上编写的?
回复

使用道具 举报

0

主题

0

好友

19

积分

新手上路

Rank: 1

发表于 2013-7-30 00:20:56 |显示全部楼层
对于citycode = city.get(cityname)这一行代码,既然city是字典,为什么不能写citycode = city[cityname]这种方式呢?后一种程序会报错。。
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-8-5 16:24:55 |显示全部楼层
grdzyz 发表于 2013-7-30 00:20
对于citycode = city.get(cityname)这一行代码,既然city是字典,为什么不能写citycode = city[cityname]这 ...

是可以的,但如果这个cityname的key在字典里找不到,就会报错。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

10

积分

新手上路

Rank: 1

发表于 2013-8-8 17:34:28 |显示全部楼层
编码问题解决分享:
我用win7的,照编码写的出了问题,返回的citycode都是None。后在群里童鞋指导下,把city.py的开头utf-8改成cp936,这样两个py文件的开头都是cp936,就成功运行了。
回复

使用道具 举报

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

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

GMT+8, 2024-3-29 15:16 , Processed in 0.020934 second(s), 27 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部