脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - python中requests爬虫中文乱码的3种解决方法

python中requests爬虫中文乱码的3种解决方法

2023-10-13 11:08一位代码 Python

requests是一个较为简单易用的HTTP请求库,是python中编写爬虫程序最基础常用的一个库。本文将详细说明,python中使用requests库编写爬虫程序时,出现【中文乱码】的原因,及常见3种解决办法。

requests是一个较为简单易用的HTTP请求库,是python中编写爬虫程序最基础常用的一个库。

而【中文乱码】问题,是最常遇到的问题,对于初学者来说,是很困恼的。

本文将详细说明,python中使用requests库编写爬虫程序时,出现【中文乱码】的原因,及常见3种解决办法。

一、【中文乱码】情况及出现原因

(一)【中文乱码】举例

首先,本文的【中文乱码】情况,指的是原网页中的中文内容在使用requests获取后,中文完全无法识别的情况,区别于\x、\u等编码情况。如下图中的例子:

python中requests爬虫中文乱码的3种解决方法

注:requests.get()方法,返回一个response对象,其存储了服务器响应的内容。

(二)出现【中文乱码】原因

导致上图中【中文乱码】的原因:

使用requests库时,选择使用的文本响应方法不合适,且没有在代码中添加设置合适的编码,以致于使用【response.text】自动获取到的网页编码,与实际网页的编码不一致,进而产生【中文乱码】。

使用requests库时,可能已经形成了一个习惯,常用【response.text】进行文本响应,而【response.content】常用于图片、视频等。

这两者,最大的一个区别就是:

1、【response.text】会自动根据HTTP头部去推测网页的编码,解码并返回解码后的文本。

2、【response.content】不会解码,直接以二进制形式返回。

两种文本响应方法,如下表:

方法 释义
response.text 服务器响应的内容,会自动根据响应头部的字符编码进行解码。根据HTTP头部对响应的编码做出有根据的推测,推测文本编码。返回类型:str;常用于:响应文本
response.content 字节方式的响应体,不会根据HTTP头部对响应的编码做出有根据的推测。返回类型:bytes(二进制);常用于:图片、视频

二、3种处理【中文乱码】的方法

(一)修改网页文本获取的方法

据上,已知原因是获取文本的方法不对,显然最简单、直接的方法就是:

直接将response.text换成response.content

python中requests爬虫中文乱码的3种解决方法

(二)手动指定网页编码、再提取文本

据上,已知使用【response.text】时,会解码返回,但解码又与原网页编码不一致,而导致【中文乱码】。

鉴于response也提供了【response.encoding】,来指定返回后的网页编码。

所以解决方法可以是:

手动指定网页编码,使之得到正常的文本

该方法的较第一种,相对麻烦一点:

首先,需要确认原网页的实际编码,然后根据网页实际编码做出修改。

具体步骤如下:

1、查看网页编码

查看网页编码,有以下两种方式:

(1)直接打开网页源码(html)【Ctr+U】,查看编码:【charset】的值。

python中requests爬虫中文乱码的3种解决方法

(2)使用response的encoding、apparent_encoding,得到网页编码。

encoding、apparent_encoding两者最大的区别:

encoding是从header中去提取,而apparent_encoding是从网页源码去解析,apparent_encoding得到的结果更准确。

详细如下表:

属性 释义
response.encoding 从网页响应的header中,提取charset字段中的编码。若header中没有charset字段,则默认为ISO-8859-1编码模式,ISO-8859-1编码无法解析中文,这也是中文乱码的原因。
response.apparent_encoding 从网页的内容中(html源码)中分析网页编码的方式。所以apparent_encoding比encoding更加准确,获取到的才是原网页的实际编码。

以(1)中网址为例,网页的真实编码为【GB2312】。

使用encoding、apparent_encoding两种方法,所得的结果是不一致的,apparent_encoding才是原网页实际编码。如下图:

python中requests爬虫中文乱码的3种解决方法

2、手动指定文本编码

根据上述方法,获得原网页的实际编码后,手动在代码中指定文本编码格式,即可解决【中文乱码】问题。

写法有2种,可任选其一,如下图:

python中requests爬虫中文乱码的3种解决方法

(三)在文本获取后对【中文乱码】进行转码

除了以上2种解决办法外,还可以使用pyhton自带的编码方法,把【中文乱码】的内容再次进行转码,转换为成网页实际的编码格式即可。

转码方式:encode(‘iso-8859-1’).decode(‘编码格式’)

如上面例子中,网页编码实际为“gb2312”,代码可修改为:

python中requests爬虫中文乱码的3种解决方法

以上就python使用requests库编写爬虫时,出现【中文乱码】的原因,及常见的三种处理方法,可供参考。

-end

到此这篇关于python中requests爬虫中文乱码的3种解决方法的文章就介绍到这了,更多相关内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/LHJCSDNYL/article/details/131755340

延伸 · 阅读

精彩推荐