设为首页收藏本站

Crossin的编程教室

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

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

使用道具 举报

0

主题

0

好友

130

积分

注册会员

Rank: 2

259#
发表于 2019-10-3 02:01:35 |只看该作者
本帖最后由 delapi 于 2019-10-3 02:13 编辑

已解决,在这个要求输入的地方输入gbk,里面呈现的内容就是中文的了,然后用这个文件去进行操作就很顺利了。如果有类似问题的人可以把这贴当个参考吧
---------------------------------------------------------------------------------------------

你好,我在学习这一课时碰到了一些问题:
我用的编辑器是pycharm,编码设置为utf-8 without DOM,电脑系统为win10,python为python3.
最初的问题跟前面的人问的差不多,city.py和编辑中的文件的开头分别用过了utf-8,cp936,gbk等等全部没有用。
然后我看到了你说到用编辑器处理一下city.py,我就重新下了一个想用idle编辑一下,但是遇到了如下提示:
The file's encoding is invalid for Python 3.x.
IDLE will convert it to UTF-8.
What's the current encoding of the file?截图如下:
idle报错
请问这种情况该如何处理,这个需要填的地方应该填什么?还是说可以绕开这一步仍然可以解决最初的问题?
回复

使用道具 举报

1

主题

0

好友

20

积分

新手上路

Rank: 1

258#
发表于 2019-1-10 19:52:59 |只看该作者
本帖最后由 Fivenail 于 2019-1-10 19:58 编辑

看前面的帖子已经找到解决方法了
======================
老师,我按照你的方法做了,但是得到的结果不一样。
我用的是win10,py3,city.py我用记事本改成了utf-8编码
汉字和摄氏度符号都显示不出来,最开始还多出一个" b' "

没汉字没符号.png (107.43 KB, 下载次数: 576)

没汉字没符号.png

回复

使用道具 举报

0

主题

0

好友

24

积分

新手上路

Rank: 1

257#
发表于 2019-1-5 17:33:30 |只看该作者
crossin先生 发表于 2019-1-5 11:05
city.py 开头的也要改
而且你要确定你的编辑器没有帮你修改编码,如果是notepad++之类的,可以去编码设置 ...

这个问题解决了,谢谢老师解答
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

256#
发表于 2019-1-5 11:05:44 |只看该作者
yby15 发表于 2019-1-4 18:36
老师,我用的编码是utf-8,试过换cp936和gtb,系统是WIN10,但是还是输入什么城市结果都是none,这个要怎么 ...

city.py 开头的也要改
而且你要确定你的编辑器没有帮你修改编码,如果是notepad++之类的,可以去编码设置里看下
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

24

积分

新手上路

Rank: 1

255#
发表于 2019-1-4 18:36:01 |只看该作者
老师,我用的编码是utf-8,试过换cp936和gtb,系统是WIN10,但是还是输入什么城市结果都是none,这个要怎么修改呢
回复

使用道具 举报

0

主题

0

好友

14

积分

新手上路

Rank: 1

254#
发表于 2018-12-20 11:34:57 来自手机 |只看该作者
crossin先生 发表于 2018-12-19 23:01
那个符号是他数据的问题,你可以手动处理一下

城市名需用用 utf8进行编码后,通过 urlquote 转成url编码 ...

谢谢老师!两个问题都已经解决了!我用的是python3 ,在网上查了发现默认源码就是utf8,所以加了一行urllib.parse.quote就可以了!
老师回得好快,太谢谢啦~~☺
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

253#
发表于 2018-12-19 23:01:11 |只看该作者
小盒子 发表于 2018-12-19 21:49
crossin 先生好~新手上路,遇到了两个问题
用的访问地址是http://wthrcdn.etouch.cn/weather_mini?city=北 ...

那个符号是他数据的问题,你可以手动处理一下

城市名需用用 utf8进行编码后,通过 urlquote 转成url编码再进行请求,不然你这里直接发送中文是会有问题的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

14

积分

新手上路

Rank: 1

252#
发表于 2018-12-19 21:49:58 |只看该作者
crossin 先生好~新手上路,遇到了两个问题
用的访问地址是http://wthrcdn.etouch.cn/weather_mini?city=北京和http://wthrcdn.etouch.cn/weather_mini?citykey=101010100
第一个问题是
我用citycode是成功的,但是最后出来的风向里面有一些符号,不知道是什么意思
第二个问题是
我用城市名访问时就会失败
下面是我的代码,和用城市代码访问的区别就是没有读取city.py,其他都是一样的,求老师指点~~

#-*-coding:gbk-*-
import json
import urllib.request
import gzip


cityname=input('你想查哪个城市的天气?\n')
if cityname:
    url=('http://wthrcdn.etouch.cn/weather_mini?citykey=%s'%cityname)
    content=urllib.request.urlopen(url).read()
    data = gzip.decompress(content)#解压缩为json
    data_c=json.loads(data)#转换为中文
    result=data_c['data']
    str_yd=result['yesterday']
    str_fc=result['forecast']
    print('今日:\n温度:%s℃ 空气质量指数:%s\n建议:%s\n'%(result['wendu'],
                                            result['aqi'],result['ganmao']))
    print('昨日:\n%s %s %s %s %s %s\n'%(str_yd['date'],str_yd['type'],
                                      str_yd['high'],str_yd['low'],str_yd['fl'],str_yd['fx']))
    print('未来5天:')
    for day in str_fc:        
        print('%s %s %s %s %s %s'%(day['date'],day['type'],day['high'],
                                   day['low'],day['fengli'],day['fengxiang']))

else:
    print('没有你想要查询的城市。')

查天气失败.png (26.2 KB, 下载次数: 553)

查天气失败.png

查天气.png (14.47 KB, 下载次数: 542)

查天气.png

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

251#
发表于 2018-11-11 17:23:09 |只看该作者
大黄 发表于 2018-11-11 16:01
老师,请教您一下:
python2.7版本
我的import json 不生效,输出的结果还是json类型

光import 没用啊,你要调用方法处理

data = json.loads(content)
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

12

积分

新手上路

Rank: 1

250#
发表于 2018-11-11 16:01:29 |只看该作者
老师,请教您一下:
python2.7版本
我的import json 不生效,输出的结果还是json类型
代码:
/*
import urllib2
import json
from city import city
cityname = raw_input('你想查哪个城市的天气?\n')
citycode = city.get(cityname)
if citycode:
   url = 'http://www.weather.com.cn/data/cityinfo/%s.html' % citycode
   content = urllib2.urlopen(url).read()
   print content
*/


回复

使用道具 举报

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

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

GMT+8, 2024-6-14 17:40 , Processed in 0.029904 second(s), 29 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部