python爬虫出现菱形问号乱码的解决方法

Python013

python爬虫出现菱形问号乱码的解决方法,第1张

在windows下使用非idle的其他ide编辑器,会碰到这个问题。对抓取到的网页内容进行先解码再编码即可。

以requests为例:

r = r.content.decode('gbk').encode('utf-8')

出现编码问题时,

1.仔细分析错误的类型。

看是decode(解码)错误还是encode(转码)错误。

2.搞清自己处理的字符串是什么类型的。

一般看网页的charset,一般为gbk,gb2312或gb18030.其中包含字符的大小为gb2312 <gbk <gb18030。一般出现‘gbk’ codec can’t decode,是因为

(1)要处理的字符串本身不是gbk编码,但是你却以gbk编码去解码

比如,字符串本身是utf-8的,但是你却用gbk去解码utf-8的字符串,所以结果不用说,则必然出错。

(2)处理的字符的确是gbk的,但是其中夹杂的部分特殊字符,是gbk编码中所没有的

如果有些特殊字符是GB18030中有的,但是是gbk中没有的。

则用gbk去解码,去所不支持的字符,也比如会出错。

所以,此种情况,可以尝试用和当前编码(gbk)所兼容的但所包含字符更多的编码(gb18030)去解码,或许就可以了。

3.然后换用这种的字符编码去编码或解码。

详情链接:https://www.crifan.com/summary_python_unicodedecode_error_possible_reasons_and_solutions/

【问题】

python输出的csv文件用excel打开,里面的中文会变成乱码,但用window下的记事本或mac下的numbers打开就正常显示。

原因是python输出的文件是utf-8编码写入的,excel默认以gbk方式读取,导致乱码发生。

【解决方法1】文件产出时encoding设置为utf-8-sig    

用excel打开csv时,excel会先检查文件的第一个字符,来了解这个文件是什么编码方式,如果这个字符是BOM,excel就知道用utf-8的方式打开这个文件。python自带了处理BOM的编码方式uft-8-sig,因此只需要在文件产出时将encoding设置为utf-8-sig。

如果文件不是由python产出的,只需要以utf-8方式读入再以utf-8-sig方式存储即可

【解决方法2】懒人法,适用只含简体中文的文件

用记事本打开,点击另存为,右下角编码方式选择“ANSI”,这个过程是把这个文件改成gbk编码格式,excel就是默认用gbk方式打开的。

参考: Python写的csv文件,如何让 Excel 双击打开不乱码? - 云+社区 - 腾讯云

对编码格式一窍不通的可以阅读以下网页

python笔记——二进制和文件编码_砍柴姑娘Jourosy的博客-CSDN博客

编码方式之ASCII、ANSI、Unicode概述 - 蓝海人 - 博客园

【简单总结】:

1. 首先需要了解 字符集 和 字符编码 两个概念,字符集定义了字符和二进制的一一对应关系,字符编码规定了如何将字符的编号存储到计算机中。

2. Unicode是字符集,包含了全球文字的唯一编码,utf-8是编码方式,将unicode以某种方式存储到计算机中。

3. 有些字符集和编码是结合在一起的,称作字符集还是编码都无所谓,比如ASCII,GBK

4. ANSI是各个国家地区不同扩展编码方式的总称,互不兼容(可以看出来通用性没有utf好)

5. 不同编码方式在转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

获得response.text有如下类似的乱码:

解决方法有两种:

第一种:

apparent_encoding方法是requests库利用chardet对字节流编码进行了猜测。一般来说使用这种方法,大部分网页的中文乱码都会恢复。如果还是不行,那就试试第二种方法。

第二种:

从网页格式中获得网页内容的编码方式(一般content-type字段会出现在HTML的header的头几行)。

如果直接拿来用,会报错

所以需要给decode加上第二个参数,decode([encoding], [errors='strict']), 第二个参数设置为ignore,则会忽略非法字符。

这样就能获得正确的中文内容了。

练习网址 https://news.mydrivers.com/1/628/628585.htm