玩蛇网提供最新Python编程技术信息以及Python资源下载!

Python 3.X 报出 'utf-8' codec can't decode byte invalid start

Python 3.6中,网页信息解析失败,试了很多种编码,查看网页的编码方式也是utf-8。
错误信息:'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte?
还有就是第一个print终端里打印出来的unicode内容是[b'\x1f\x8b\x08\x00\x...]这种格式的,之前也有过这种情况,一个print打2个变量,就是b'\x, 如果分来2行打又变回了汉字。是因为什么原因呢?

# -*- coding: utf-8 -*-
import json , sqlite3
import urllib.request

url = ('http://wthrcdn.etouch.cn/weather_mini?city=%E4%B8%8A%E6%B5%B7')
resp = urllib.request.urlopen(url)
content = resp.read()

print(content)
print(type(content))
print(content.decode('utf-8'))

建议用requeset,代码如下:

import requests

r = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=%E4%B8%8A%E6%B5%B7')
print(r.text)

看了一下网站返回的是gzip压缩过的数据,所以要进行解码

# coding=utf-8
from io import BytesIO
import gzip
import urllib.request

url = ('http://wthrcdn.etouch.cn/weather_mini?city=%E4%B8%8A%E6%B5%B7')
resp = urllib.request.urlopen(url)
content = resp.read() # content是压缩过的数据

buff = BytesIO(content) # 把content转为文件对象
f = gzip.GzipFile(fileobj=buff)
res = f.read().decode('utf-8')
print(res)

requests不好用吗?

不是字符编码问题, 你看看你请求的 Respont headers



    Status Code: 200 OK
    Access-Control-Allow-Headers: *
    Access-Control-Allow-Methods: *
    Access-Control-Allow-Origin: *
    Cache-Control: must-revalidate, max-age=300
    Connection: Keep-Alive
    Content-Encoding: gzip
    Content-Length: 443
    Date: Fri, 10 Mar 2017 03:20:46 GMT
    Fw-Cache-Status: hit
    Fw-Via: HTTP MISS from 58.59.19.99, DISK HIT from 183.131.161.27
    Server: Tengine/2.1.2

是gzip, 如果用标准库的东西, 还需要把gzip 给解开

玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd13759.html

相关文章 Recommend

玩蛇网Python互助QQ群,欢迎加入-->: 106381465 玩蛇网Python新手群
修订日期:2017年05月24日 - 19时10分46秒 发布自玩蛇网

您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容
我要分享到:

必知PYTHON教程 Must Know PYTHON Tutorials

必知PYTHON模块 Must Know PYTHON Modules