设为首页收藏本站

Crossin的编程教室

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

【查天气】求助,返回的content一直都是乱码

[复制链接]

2

主题

0

好友

34

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2018-7-5 11:06:43 |只看该作者 |倒序浏览

求助,看了论坛里好多帖子,都没法搞定这个乱码,求大神帮忙解决,谢谢!
我自己用浏览器访问这个接口,把浏览器换成utf-8的可以正常显示,但是代码里用gbk还是utf8都是乱的!
微信截图_20180705110515.png
微信截图_20180705110447.png


# -*- coding: gbk -*-
import urllib.request  # 导入import urllib.request,python3用
import json
from city import city  # 前一个“city”是模块名,也就是py文件的名称,后一个“city”是模块中变量的名称。

cityname = input("which city?\n")
citycode = city.get(cityname)
if citycode:
    try:
    # url = "http://www.weather.com.cn/data/cityinfo/%s.html" % citycode
        url = "http://wthrcdn.etouch.cn/weather_mini?citykey=%s" % citycode
        content = urllib.request.urlopen(url).read()
        data = json.loads(content)
        result = data['yesterday']
        str_map = ("%s\n%s ~ %s") % (result["type"], result["high"], result["low"])
        #print(content.decode("utf-8", errors="replace"))
        #print(content.decode("gbk"))
        #print(str_map.decode('utf8',errors ="replace"))
    except:
        #print("查询失败")
        print(content.decode("gbk", errors="replace"))
else:
    print("没找到该城市")


回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2018-7-5 14:37:26 |只看该作者
把pycharm的编码设置全部设为utf8再做
公众号回复 pycharm,看下里面关于编码设置的说明(不光是代码开头的encoding)
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

34

积分

新手上路

Rank: 1

板凳
发表于 2018-7-5 15:07:42 |只看该作者
crossin先生 发表于 2018-7-5 14:37
把pycharm的编码设置全部设为utf8再做
公众号回复 pycharm,看下里面关于编码设置的说明(不光是代码开头的 ...

我用了requests模块,能直接拿到json格式的值了,但是我接下来按照课程里说的,增加data = json.loads(content),转换成字典,程序报错了,报错是TypeError: the JSON object must be str, bytes or bytearray, not 'dict'
代码如下:

# -*- coding: utf-8 -*-
import urllib.request  # 导入import urllib.request,python3用
import requests
import json
from city import city  # 前一个“city”是模块名,也就是py文件的名称,后一个“city”是模块中变量的名称。

cityname = input("which city?\n")
citycode = city.get(cityname)
if citycode:
    # try:
        # url = "http://www.weather.com.cn/data/cityinfo/%s.html" % citycode
        url = "http://wthrcdn.etouch.cn/weather_mini?citykey=%s" % citycode
        content = requests.get(url).json()
        print(content)
        data = json.loads(content)
        print(data)
        #result = data['data']
        #str_map = ("%s\n%s ~ %s") % (result["yesterday"], result["date"], result["high"])
        #content = urllib.request.urlopen(url) # .read().decode("utf8" ,'ignore')
        #data = json.loads(content)
        #result = data['yesterday']
        #str_map = ("%s\n%s ~ %s") % (result["type"], result["high"], result["low"])
        #print(content.decode("utf-8", errors="replace"))
        #print(content.decode("gbk"))
        #print(str_map.decode('utf8',errors ="replace"))
        #print (str_map)

    # except:



else:
    print("没找到该城市")


回复

使用道具 举报

2

主题

0

好友

34

积分

新手上路

Rank: 1

地板
发表于 2018-7-5 16:58:34 |只看该作者
crossin先生 发表于 2018-7-5 14:37
把pycharm的编码设置全部设为utf8再做
公众号回复 pycharm,看下里面关于编码设置的说明(不光是代码开头的 ...

搞了一天,终于自己搞出来了,总结下用到的的知识点及不懂的地方:
1.用requests避免乱码
2.requests可以直接取到json格式,但是不知道为什么没法用教程里的方法专程字典,这块希望老师讲解一下。
3.把.jason更换为.content方法后,可以用教程里的方法进行json.load了。
4.之后遇到一个比较坑的地方,这个接口传的json格式比例子里的复杂,用到的温度key值一样。
5.用json在线转换工具格式化了一下json报文,用到数组取值的概念,取了今天7月4日的城市名和高温+低温三个值。
6.感觉简单的例子里面包含了很多内容。。
  1. # -*- coding: utf-8 -*-
  2. import requests
  3. import json
  4. from city import city


  5. _city_name = input("which city?\n")
  6. _city_code = city.get(_city_name)
  7. if _city_code:
  8.     try:
  9.         url = "http://wthrcdn.etouch.cn/weather_mini?citykey=%s" % _city_code
  10.         content = requests.get(url).content
  11.         data = json.loads(content)
  12.         result = data['data']
  13.         str_temp = ('%s\n%s ~ %s') % (result["city"],result["forecast"][0]["high"],result["forecast"][0]["low"])
  14.         print(str_temp)
  15.     except:
  16.         print("查询失败")
  17. else:
  18.     print("没找到该城市")
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

5#
发表于 2018-7-5 23:35:38 |只看该作者
feeso4 发表于 2018-7-5 16:58
搞了一天,终于自己搞出来了,总结下用到的的知识点及不懂的地方:
1.用requests避免乱码
2.requests可以 ...

是的
总结很到位!
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

34

积分

新手上路

Rank: 1

6#
发表于 2018-7-18 15:51:57 |只看该作者
crossin先生 发表于 2018-7-5 23:35
是的
总结很到位!

老师给讲讲,用了request模块后,如果写成 content = requests.get(url).json() 直接拿json格式的话,接下来程序该怎么改呀,我改了好多次都没改出来。。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

7#
发表于 2018-7-18 16:01:54 |只看该作者
feeso4 发表于 2018-7-18 15:51
老师给讲讲,用了request模块后,如果写成 content = requests.get(url).json() 直接拿json格式的话,接 ...

data = json.loads(content)
相当于
content = requests.get(url).json()
data = content
其他一样
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

2

主题

0

好友

34

积分

新手上路

Rank: 1

8#
发表于 2018-7-18 16:13:03 |只看该作者
crossin先生 发表于 2018-7-18 16:01
data = json.loads(content)
相当于
content = requests.get(url).json()

嗯嗯!刚刚我自己也研究出来了,我把各个对象的类型都print了一下。。然后找出来咋改的。。哈哈
  1. # -*- coding: utf-8 -*-

  2. import requests

  3. from city import city

  4. _city_name = input("which city?\n")
  5. _city_code = city.get(_city_name)
  6. if _city_code:
  7.     try:
  8.         url = "http://wthrcdn.etouch.cn/weather_mini?citykey=%s" % _city_code
  9.         content = requests.get(url).json()
  10.         result = content['data']
  11.         str_temp = ('%s\n%s ~ %s') % (result["city"], result["forecast"][1]["high"], result["forecast"][1]["low"])
  12.         print(str_temp)
  13.     except:
  14.         print("查询失败")
  15. else:
  16.     print("没找到该城市")
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

9#
发表于 2018-7-18 16:47:54 |只看该作者
feeso4 发表于 2018-7-18 16:13
嗯嗯!刚刚我自己也研究出来了,我把各个对象的类型都print了一下。。然后找出来咋改的。。哈哈 ...

你这个思路是对的
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-5-2 15:16 , Processed in 0.031347 second(s), 28 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部