设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 143664|回复: 91
打印 上一主题 下一主题

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

  [复制链接]

174

主题

45

好友

11万

积分

管理员

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
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

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

使用道具 举报

174

主题

45

好友

11万

积分

管理员

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
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2013-8-18 11:57:34 |显示全部楼层
jako 发表于 2013-8-17 23:55
在ubuntu虚拟机和win7都试了,都不行,怎么回事呢?

请求的地址有问题
把url输出来看看呢
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2013-8-18 22:42:48 |显示全部楼层
jako 发表于 2013-8-18 16:09
我试了下 把输出来的url  复制到浏览器上,结果打不开,我觉得应该是站点的问题,在43课的那几个网站也打 ...

浏览器打不开是正常的,是它xml文件格式问题,你在网页上查看源代码就能看到内容了,这个不影响。

我意思,把你程序中拼出来的“url”变量打出来。如果我没猜错,你的citycode没有拿到正确的值
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

6#
发表于 2013-8-20 14:30:47 |显示全部楼层
jako 发表于 2013-8-18 23:15
输出url是这样子

不要用https,改成http
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

7#
发表于 2013-9-10 23:25:26 |显示全部楼层
Sooongz 发表于 2013-9-10 22:49
为什么我在python3下获得的数据是这样的
b'{"weatherinfo":{"city":"\xe5\x8d\x97\xe4\xba\xac","cityid":" ...

你这个已经快接近了啊,把这个json数据取出来就是结果了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

8#
发表于 2013-10-10 17:47:51 |显示全部楼层
TongShan 发表于 2013-10-10 17:26
在虚拟机centos环境下,没有出现城市名称乱码,但是仍然没有出现输入城市名称的选项,最后返回到错误如下, ...

你的city.py这个文件,是一个获取城市列表的程序,也就是查天气之前要做的准备工作。这个和43课附件里那个city.py不是一个东西。你可以去43课(【Python 第43课】 查天气(1)
http://crossin.me/forum.php?mod= ... tid=8&fromuid=3
)附件里下载抓取好的城市列表。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

9#
发表于 2013-10-10 17:49:57 |显示全部楼层
TongShan 发表于 2013-10-10 16:39
运行程序后没有要求输入需要查询的城市,而是直接列出了所以的城市名称和对应代码,部分城市名称为乱码 ...

至于乱码问题,可以参考这里:http://crossin.me/forum.php?mod= ... d=799&fromuid=3
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

10#
发表于 2013-10-16 15:54:47 |显示全部楼层
pyer_hwb 发表于 2013-10-16 13:36
问个问题啊。
我在windows上和linux上都运行相同的代码,但是结果不一样..
代码都是如下所示然后我在linux ...

编码的问题。但我也不确定是那里的问题。
可能是因为,你的文件编码是utf8,但你保存的网页内容里面并没有指定编码,或者指定的不是utf8编码。所以浏览器默认并不知道要用何种编码来显示。在windows下出问题,可能是和windows下你那个浏览器的默认显示编码有关
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-5-7 20:28 , Processed in 0.036964 second(s), 29 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部