解决中文编码问题

经常在爬虫的时候会出现中文乱码的问题,主要有以下几种情况:
(1)使用requests获得网站内容后,发现中文显示乱码;
(2)将某个字符串decode时,字符串中有非法字符,程序出现异常;
(3)网页使用gzip压缩,解析网页数据的时候中文乱码显示;
(4)写入和读取文件的时候,文件显示的字符串不是正确的中文。
对于以上情况,各自的解决方法如下所示:

(1)使用requests获得网站内容后,发现中文显示乱码

大多数网页的编码方式都是UTF-8,Requests会自动解码来自服务器的内容。而有些网页可能是其他的编码方式,比如gbk。因此在获取网页内容时需要加上r.encoding = ‘gbk’。

import requests
from bs4 import BeautifulSoup
url = 'https://www.w3school.com.cn/'
r = requests.get(url)
r.encoding = 'gbk'  #加上编码方式
soup = BeautifulSoup(r.text,"lxml")  #乱码因为代码中获得的网页的响应体r和网站的编码方式不同
title = soup.find("div",class_="idea").h2.text
print(title)

(2)将某个字符串decode时,字符串中有非法字符,程序出现异常

有些网站的编码不规范,可能在一个页面里混入了多种编码,这样就会出现非法字符,可以采用ignore忽略这些非法字符。可以采用ignore忽略这些非法字符:

str1.decode('GBK','ignore')

decode函数为decode([encoding],[errors='strict']),第二个变量为控制错误处理的方式,默认为strict,遇到非法字符时会抛出异常。该参数有三种变量可设置:
1> ignore:忽略其中的非法字符,仅显示有效字符;
2> replace:使用符号代替非法字符,如’?';
3> xmlcharrefreplace:使用XML字符引用代替非法字符。

(3)网页使用gzip压缩,解析网页数据的时候中文乱码显示

在解析网页数据时出现中文乱码,可能是因为网站使用gzip将网页压缩了。这时候需要先解码才行,而r.content会自动解码gzip和deflate传输编码的响应数据。

import requests
url = 'http://www.sina.com.cn/'
r = requests.get(url)   #中文乱码,因为新浪网使用gzip将网页压缩,需要先解码才行

import chardet
after_gzip = r.content #先用r.content解压gzip
print('解压后字符串的编码为:',chardet.detect(after_gzip)) #chardet.detect找到字符串的编码方式
print(after_gzip.decode('utf-8'))  #最后解码为unicode

(4)写入和读取文件的时候,文件显示的字符串不是正确的中文

windows系统安装的是简体中文版,对于TXT和CSV文件来说,默认编码方式为gbk(txt文件的ANSI编码),所以在读取和保存文件的时候,一定要注明文件的编码方式。
json文件默认以Unicode编码处理,如果要显示json文件中的中文,代码加上ensure_ascii=False,具体如下:

import json
title = '我们 love 你们'
with open('title.json','w',encoding = 'UTF-8') as f:
    json.dump([title],f,ensure_ascii=False)

你可能感兴趣的:(python网络爬虫,beautifulsoup)