设为首页收藏本站

Crossin的编程教室

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

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

[复制链接]

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'没有找到该城市'



回复

使用道具 举报

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

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. 查询失败
复制代码
回复

使用道具 举报

0

主题

0

好友

28

积分

新手上路

Rank: 1

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

原来是少了一层字典,没有看出来,终于搞出来了!
# -*- 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['data']
        data4=data3['forecast'][0]
        str_temp=('%s\n%s\n%s\n%s')%(
            data4['date'],
            data4['type'],
            data4['low'],
            data4['high']
            )
        print str_temp

    except:
        print '查询失败'
else:
    print'没有找到该城市'
  1. ====================== RESTART: D:\Python\lesson 45.py ======================
  2. 你想查哪个城市的天气?
  3. 北京
  4. 101010100
  5. http://wthrcdn.etouch.cn/weather_mini?citykey=101010100
  6. 12日星期五

  7. 低温 -10℃
  8. 高温 -1℃
  9. >>>
  10. ====================== RESTART: D:\Python\lesson 45.py ======================
  11. 你想查哪个城市的天气?
  12. 上海
  13. 101020100
  14. http://wthrcdn.etouch.cn/weather_mini?citykey=101020100
  15. 12日星期五

  16. 低温 -2℃
  17. 高温 5℃
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

105#
发表于 2018-1-12 16:32:49 |只看该作者
xiejiali 发表于 2018-1-12 00:54
原来是少了一层字典,没有看出来,终于搞出来了!
# -*- coding:gbk -*-
import urllib2

调试的时候可以把 try 去掉,方便看报错
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

28

积分

新手上路

Rank: 1

106#
发表于 2018-1-12 22:53:42 |只看该作者
crossin先生 发表于 2018-1-12 16:32
调试的时候可以把 try 去掉,方便看报错

好的好的~非常感谢老师~
回复

使用道具 举报

0

主题

0

好友

4

积分

新手上路

Rank: 1

107#
发表于 2018-1-20 15:35:44 |只看该作者
【添砖加瓦】
Python3 调用urllib获取网络资源、gzip解压的方法:
1、与Python2不同,Python3调用的是urllib.request;
2、与Python2不同,Python3调用gzip模块后,直接使用gzip.decompress()函数解压。
代码如下:

from city import city
import urllib.request
import gzip

cityname=input("请输入你想查询天气的城市名称?\n")
citycode=city.get(cityname)


if citycode:
    url=("http://wthrcdn.etouch.cn/weather_mini?citykey=%s"%citycode)
    print(url)
   
    content=urllib.request.urlopen(url).read()
    content=gzip.decompress(content) .decode("utf-8")
    print(content)
回复

使用道具 举报

0

主题

0

好友

56

积分

注册会员

Rank: 2

108#
发表于 2018-3-29 23:30:22 |只看该作者
xiejiali 发表于 2018-1-12 00:54
原来是少了一层字典,没有看出来,终于搞出来了!
# -*- coding:gbk -*-
import urllib2

太感谢这位大兄弟了,在这里困住好久了!!
回复

使用道具 举报

0

主题

0

好友

4

积分

新手上路

Rank: 1

109#
发表于 2018-5-7 22:20:52 |只看该作者
你好,我自己试了一下发现每次都没有找到城市。完全复制您的代码也是这样,让后我输出citycode发现是none,这是怎么回事
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

110#
发表于 2018-5-7 23:56:24 |只看该作者
zhangkai 发表于 2018-5-7 22:20
你好,我自己试了一下发现每次都没有找到城市。完全复制您的代码也是这样,让后我输出citycode发现是none, ...

windows要用gbk
帖子前面有提到
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-11-22 17:59 , Processed in 0.017291 second(s), 22 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部