UnicodeDecodeError错误是在使用Python的时候最常碰到的问题。谁让我们博大精深的中文不能用简简单单256个字符表示呢。 加之有很多错误犯了又犯。因此,整理此UnicodeDecodeError菜谱。(此文会不定时更新╮(╯▽╰)╭)
解析网页返回值时使用例如
resp.decode("utf-8")
出现'utf8' codec can't decode byte 0x8b in position 1:
查看response header有Content-Type:application/x-javascript; charset=UTF-8
。因此使用utf-8解码是没有问题的。去掉decode直接print到控制台却发现resp为一堆乱码。 此时,查看response header发现Content-Encoding:gzip
。(关于gzip,可以参考HTTP协议 (三) 压缩)因此,可以选择手动解压,或者去掉Content-Encoding:gzip
参考: urllib2 乱码问题json.dump生成的文件中中文被保存成
\uXXXX\uXXXX
的形式。 因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False。 参考:python json.dumps 中的ensure_ascii 参数引起的中文编码问题使用scrapy时,用export feed导出的json文件中若出现中文,中文会被保存成
\uXXXX\uXXXX
的形式。 原因同上.修改方式是: 找到scrapy/extensions/feedexport.py
文件,将FeedExporter
类中的open_spider
方法修改为如下:然后在project的1
2
3
4
5
6
7
8
9def open_spider(self, spider):
uri = self.urifmt % self._get_uri_params(spider)
storage = self._get_storage(uri)
file = storage.open(spider)
# enable user defined feed parameters
kw = self.settings.get('FEED_PARAMS',{})
exporter = self._get_exporter(file, fields_to_export=self.export_fields,**kw)
exporter.start_exporting()
self.slot = SpiderSlot(file, exporter, storage, uri)settings.py
文件中增加一行配置项:FEED_PARAMS = {'ensure_ascii': False, 'indent': 4}
解析html,根据charset得知编码方式为gb2312,因此解码使用html.decode("gb2312"),结果报错:
UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 218066-218067
有些网站虽然声明了编码方式为gb2312,但实际上应该使用这个字符集的超集GBK来解码。修改成html.decode("gbk")即可。