设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
楼主: crossin先生
打印 上一主题 下一主题

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

[复制链接]

0

主题

0

好友

28

积分

新手上路

Rank: 1

103#
发表于 2018-1-12 00:35:35 |只看该作者
crossin先生 发表于 2018-1-11 15:30
了解下JSON格式,可以直接整个转成字典

老师,我看我转成了字典,可是下一步为什么还是失败呢?
  1. # -*- coding:gbk -*-
  2. import urllib2
  3. import json

  4. from city import city
  5. from StringIO import StringIO
  6. import gzip

  7. cityname=raw_input('你想查哪个城市的天气?\n')
  8. citycode=city.get(cityname)
  9. print citycode

  10. if citycode:
  11.     try:
  12.         url=('http://wthrcdn.etouch.cn/weather_mini?citykey=%s'%citycode)
  13.         print url
  14.         content=urllib2.urlopen(url).read()
  15.         buf = StringIO(content)
  16.         f = gzip.GzipFile(fileobj=buf)
  17.         data=f.read()
  18.         print data
  19.         print type(data)
  20.         data2=json.loads(data)
  21.         print data2
  22.         print type(data2)
  23.         data3=data2['forecast']
  24.         print data3

  25.     except:
  26.         print '查询失败'
  27. else:
  28.     print'没有找到该城市'
复制代码
输出的结果是这样的:
  1. 你想查哪个城市的天气?
  2. 北京
  3. 101010100
  4. http://wthrcdn.etouch.cn/weather_mini?citykey=101010100
  5. {"data":{"yesterday":{"date":"11日星期四","high":"高温 -1℃","fx":"北风","low":"低温 -10℃","fl":"<![CDATA[<3级]]>","type":"晴"},"city":"北京","aqi":"48","forecast":[{"date":"12日星期五","high":"高温 -1℃","fengli":"<![CDATA[<3级]]>","low":"低温 -10℃","fengxiang":"北风","type":"晴"},{"date":"13日星期六","high":"高温 2℃","fengli":"<![CDATA[<3级]]>","low":"低温 -9℃","fengxiang":"西南风","type":"晴"},{"date":"14日星期天","high":"高温 4℃","fengli":"<![CDATA[<3级]]>","low":"低温 -7℃","fengxiang":"南风","type":"多云"},{"date":"15日星期一","high":"高温 5℃","fengli":"<![CDATA[<3级]]>","low":"低温 -5℃","fengxiang":"西南风","type":"晴"},{"date":"16日星期二","high":"高温 4℃","fengli":"<![CDATA[<3级]]>","low":"低温 -4℃","fengxiang":"东北风","type":"多云"}],"ganmao":"昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。","wendu":"-9"},"status":1000,"desc":"OK"}
  6. <type 'str'>
  7. {u'status': 1000, u'data': {u'city': u'\u5317\u4eac', u'yesterday': {u'fx': u'\u5317\u98ce', u'type': u'\u6674', u'high': u'\u9ad8\u6e29 -1\u2103', u'low': u'\u4f4e\u6e29 -10\u2103', u'date': u'11\u65e5\u661f\u671f\u56db', u'fl': u'<![CDATA[<3\u7ea7]]>'}, u'forecast': [{u'fengxiang': u'\u5317\u98ce', u'high': u'\u9ad8\u6e29 -1\u2103', u'fengli': u'<![CDATA[<3\u7ea7]]>', u'date': u'12\u65e5\u661f\u671f\u4e94', u'type': u'\u6674', u'low': u'\u4f4e\u6e29 -10\u2103'}, {u'fengxiang': u'\u897f\u5357\u98ce', u'high': u'\u9ad8\u6e29 2\u2103', u'fengli': u'<![CDATA[<3\u7ea7]]>', u'date': u'13\u65e5\u661f\u671f\u516d', u'type': u'\u6674', u'low': u'\u4f4e\u6e29 -9\u2103'}, {u'fengxiang': u'\u5357\u98ce', u'high': u'\u9ad8\u6e29 4\u2103', u'fengli': u'<![CDATA[<3\u7ea7]]>', u'date': u'14\u65e5\u661f\u671f\u5929', u'type': u'\u591a\u4e91', u'low': u'\u4f4e\u6e29 -7\u2103'}, {u'fengxiang': u'\u897f\u5357\u98ce', u'high': u'\u9ad8\u6e29 5\u2103', u'fengli': u'<![CDATA[<3\u7ea7]]>', u'date': u'15\u65e5\u661f\u671f\u4e00', u'type': u'\u6674', u'low': u'\u4f4e\u6e29 -5\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 4\u2103', u'fengli': u'<![CDATA[<3\u7ea7]]>', u'date': u'16\u65e5\u661f\u671f\u4e8c', u'type': u'\u591a\u4e91', u'low': u'\u4f4e\u6e29 -4\u2103'}], u'ganmao': u'\u663c\u591c\u6e29\u5dee\u8f83\u5927\uff0c\u8f83\u6613\u53d1\u751f\u611f\u5192\uff0c\u8bf7\u9002\u5f53\u589e\u51cf\u8863\u670d\u3002\u4f53\u8d28\u8f83\u5f31\u7684\u670b\u53cb\u8bf7\u6ce8\u610f\u9632\u62a4\u3002', u'wendu': u'-9', u'aqi': u'48'}, u'desc': u'OK'}
  8. <type 'dict'>
  9. 查询失败
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

102#
发表于 2018-1-11 15:30:43 |只看该作者
xiejiali 发表于 2018-1-11 07:37
老师,我用的是http://wthrcdn.etouch.cn/weather_mini?citykey=%s的接口,但是这个返回的数据有很多层,该 ...

了解下JSON格式,可以直接整个转成字典
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

28

积分

新手上路

Rank: 1

101#
发表于 2018-1-11 07:37:58 |只看该作者
老师,我用的是http://wthrcdn.etouch.cn/weather_mini?citykey=%s的接口,但是这个返回的数据有很多层,该怎么抓取信息呢?我是小白。。这样写的,我是在想,把最外层的转成一个字典,再把这个字典里那个forecast再转成一个字典,然后抓取type,low和high,但是写的好像不对。。。这是我写的和它之前返回的信息:
{
    "data":{
        "yesterday":{
            "date":"10日星期三",
            "high":"高温 -2℃",
            "fx":"西北风",
            "low":"低温 -10℃",
            "fl":"<![CDATA[4-5级]]>",
            "type":"晴"
            },
        "city":"北京",
        "aqi":"26",
        "forecast":[{
            "date":"11日星期四",
            "high":"高温 -1℃",
            "fengli":"<![CDATA[<3级]]>",
            "low":"低温 -10℃",
            "fengxiang":"北风",
            "type":"晴"
            },
                    {
            "date":"12日星期五",
            "high":"高温 2℃",
            "fengli":"<![CDATA[<3级]]>",
            "low":"低温 -9℃",
            "fengxiang":"西南风",
            "type":"晴"
            },
                    {
            "date":"13日星期六",
            "high":"高温 3℃",
            "fengli":"<![CDATA[<3级]]>",
            "low":"低温 -7℃",
            "fengxiang":"南风",
            "type":"多云"
            },
                    {
            "date":"14日星期天",
            "high":"高温 5℃",
            "fengli":"<![CDATA[<3级]]>",
            "low":"低温 -6℃",
            "fengxiang":"西风",
            "type":"晴"
            },
                    {
            "date":"15日星期一",
            "high":"高温 4℃",
            "fengli":"<![CDATA[<3级]]>",
            "low":"低温 -4℃",
            "fengxiang":"东南风",
            "type":"多云"}],
        "ganmao":"天气较凉,较易发生感冒,请适当增加衣服。体质较弱的朋友尤其应该注意防护。",
        "wendu":"-9"
        },
    "status":1000,
    "desc":"OK"}


# -*- coding:gbk -*-
import urllib2
import json

from city import city
from StringIO import StringIO
import gzip

cityname=raw_input('你想查哪个城市的天气?\n')
citycode=city.get(cityname)
print citycode

if citycode:
    try:
        url=('http://wthrcdn.etouch.cn/weather_mini?citykey=%s'%citycode)
        print url
        content=urllib2.urlopen(url).read()
        buf = StringIO(content)
        f = gzip.GzipFile(fileobj=buf)
        data=f.read()
        data2=json.loads(data)
        data3=data2.get(forecast)
        data4=json.loads(data3)
        result=data4['forecast']
        str_temp=('%s\n%s~%s')%(result['type'],result['low'],result['high'])
        print str_temp
    except:
        print '查询失败'
else:
    print'没有找到该城市'



回复

使用道具 举报

0

主题

0

好友

30

积分

新手上路

Rank: 1

100#
发表于 2018-1-2 23:55:23 |只看该作者
wlfrank 发表于 2018-1-2 23:38
各位大佬求帮助,我现在用的新的地址反馈的天气信息但是是乱码,请问这种情况应该怎么处理哪 ...

已核实为网页编码压缩输出问题,已解决http://www.voidcn.com/article/p-qpuzajek-hr.html
回复

使用道具 举报

0

主题

0

好友

30

积分

新手上路

Rank: 1

99#
发表于 2018-1-2 23:38:14 |只看该作者
各位大佬求帮助,我现在用的新的地址反馈的天气信息但是是乱码,请问这种情况应该怎么处理哪

微信图片_20180102233445.png (42.78 KB, 下载次数: 227)

微信图片_20180102233445.png

1514907325(1).jpg (23.32 KB, 下载次数: 228)

1514907325(1).jpg

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

98#
发表于 2017-11-23 22:31:03 |只看该作者
bobo0769 发表于 2017-11-23 08:26
# -*- coding: utf-8 -*-
from urllib.request import urlopen  #打开网页函数
import urllib

那说明你拿到的content不对,你要看看content是什么
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

97#
发表于 2017-11-23 08:26:26 |只看该作者
# -*- coding: utf-8 -*-
from urllib.request import urlopen  #打开网页函数
import urllib
import json
from city import city  #把city文件作为函数引用

f=open('c:\Python34\city.py')
cityname=input('你想查哪个城市的天气?\n')
citycode=city.get(cityname)
if citycode:
    url=("http://www.weather.com.cn/weather1d/%s.shtml#search" %citycode)
    content=urlopen(url).read().decode()  #解码网址
    data=json.loads(content,'utf-8')      #把字符串转成字典
    result=data["weatherinfo"]
    str_temp=("%s\n%s~%s")%(result["weather"],result["temp1"],result["temp2"])
    print(str_temp)
f.close()
不管有没有decode都是在json.loads那里出错,请大神指教
回复

使用道具 举报

0

主题

0

好友

60

积分

注册会员

Rank: 2

96#
发表于 2017-11-6 17:48:04 |只看该作者
整合了这两课的内容,小小修改了一下
  1. import urllib.request
  2. import json
  3. from city import city

  4. exit=False

  5. while not exit:
  6.     cityname=input("你想查询哪个城市的天气?输入 q 退出查询\n")
  7.     citycode = city.get(cityname)
  8.     if cityname=="q" or cityname=="Q":
  9.         print("退出!")
  10.         exit=True
  11.     else:

  12.         if citycode:
  13.             try:
  14.                 url = ("http://www.weather.com.cn/data/cityinfo/%s.html" % citycode)
  15.                 request = urllib.request.Request(url)
  16.                 response = urllib.request.urlopen(request)
  17.                 content = response.read().decode("utf-8")
  18.                 print('未转化输出:%s'%content)
  19.                 print('url%s'%url)
  20.                 data = json.loads(content)   # 输出转化为字典dict
  21.                 print('转化后输出:%s'%data)
  22.                 print(type(content))
  23.                 print(type(data))
  24.                 result = data['weatherinfo']
  25.                 str_temp = ('%s\n%s ~ %s')%(
  26.                     result['weather'],
  27.                     result['temp1'],
  28.                     result['temp2']
  29.                 )
  30.                 print(str_temp)

  31.             except:
  32.                 print('查询失败')
  33.         else:
  34.             print('没有找到该城市')
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

95#
发表于 2017-11-2 13:04:19 |只看该作者
asphodelus 发表于 2017-11-2 12:29
py3似乎不少用法都和py2不一样了,raw_input,urllib等等
为了测试方便,去掉了try except添加打印content
...

你做的是对的

你也可以用 requests 库,可以省很多事
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

25

积分

新手上路

Rank: 1

94#
发表于 2017-11-2 12:29:49 |只看该作者
本帖最后由 asphodelus 于 2017-11-2 12:34 编辑

py3似乎不少用法都和py2不一样了,raw_input,urllib等等
为了测试方便,去掉了try except添加打印content
改成content = urllib.request.urlopen(url).read().decode()
json解码问题似乎就解决了,不确定这么做是否一直有效,烦请先生来指点一下~附上截图






1.png (11.67 KB, 下载次数: 223)

1.png

2.png (14.49 KB, 下载次数: 229)

2.png

3.png (10 KB, 下载次数: 229)

3.png

回复

使用道具 举报

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

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

GMT+8, 2024-5-19 09:11 , Processed in 0.028699 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部