Python3中,字符串默认的编码为Unicode。
Python的字符编码
encode的作用是将Unicode编码转换成其他的编码的字符串,而decode的作用是将其他编码的字符串转换成Unicode编码。
解决中文编码问题
中文乱码会出现的几种情况:
- 问题1,使用requests获得网站内容后,发现中文显示乱码。
- 问题2,将某个字符串decode时,字符串中有非法字符,程序抛出异常。
- 问题3,网页使用gzip压缩,解析网页数据的时候中文不乱码显示。
- 问题4,写入和读取文件的时候,文件显示的字符串不是正确的中文。
问题1,获取网站的中文显示乱码
import requests
from bs4 import BeautifulSoup
url = 'https://www.w3school.com.cn/'
r = requests.get(url)
r.encoding = 'gb2312'
soup = BeautifulSoup(r.text, 'lxml')
xx = soup.find('div', id='d1').h2.text
print(xx)
问题2,非法字符串抛出异常
出错的原因是某些网站的编码不规范,在一个页面混入了多种编码,于是出现了非法字符。这种情况的出现会让整个爬虫程序出错,然后停止运行。
解决方法很简单,可以采用ignore忽略这些非法字符。
str1.decode('GBK', 'ignore')
第二个变量为控制错误处理的方式,默认为strict,遇到非法字符时会抛出异常。
可以把第二个参数设置为其他变量,有以下三种:
- ignore,忽略其中的非法字符,仅显示有效字符。
- replace,使用符号代替非法字符。
- xmlcharrefreplace,使用xml字符引用代替非法字符。
问题3,网页使用gzip压缩
使用r.content会自动解码gzip和deflate传输编码的响应数据。
import chardet
import requests
url = 'https://www.sina.com.cn/'
r = requests.get(url)
after_gzip = r.content
# 找出字符串的编码方式 为 utf-8
text = chardet.detect(after_gzip)
print(after_gzip.decode('utf-8'))