本人代码实际测试

通过 request 的 get 请求某目标页面,发现中文全部乱码

网页显示:

html中文乱码问题 java怎么解决 html出现乱码怎么办_postman返回中文乱码

命令行显示:

html中文乱码问题 java怎么解决 html出现乱码怎么办_html中文乱码问题 java怎么解决_02

来查看一下网页返回的字符集类型

html中文乱码问题 java怎么解决 html出现乱码怎么办_postman返回中文乱码_03

老硬币了,这里显示 utf8

通过 request 返回的属性来看

print(resp.encoding) #查看网页返回的字符集类型

print(resp.apparent_encoding) #自动判断字符集类型

html中文乱码问题 java怎么解决 html出现乱码怎么办_html中文乱码_04

发现问题!

接下来的我们就进行编码解码来搞他

def get(url, transform):
    resp = requests.get(url, timeout=10)
print(resp.url, resp.status_code)
print(resp.encoding) #查看网页返回的字符集类型 这里返回ISO-8859
print(resp.apparent_encoding) #自动判断字符集类型 发现这里返回 GB2312! 我们进行转换gbk

    html = resp.text.encode('iso-8859-1').decode('gbk')
print('html: ', html)

搞定,可以继续爬虫了.

html中文乱码问题 java怎么解决 html出现乱码怎么办_mysql在网页上显示乱码_05

乱码问题的由来

关于网络爬虫的乱码处理。注意,这里不仅是中文乱码,还包括一些如日文、韩文 、俄文、藏文之类的乱码处理,因为他们的解决方式 是一致的,故在此统一说明。

一、乱码问题的出现

就以爬取 51job 网站举例,讲讲为何会出现 “乱码” 问题,如何解决它以及其背后的机制。

代码示例:

import requests

url = “http://search.51job.com"

res = requests.get(url)

print(res.text)

显示结果:

html中文乱码问题 java怎么解决 html出现乱码怎么办_oracle 中文显示乱码_06

打印 res.text 时,发现了什么?中文乱码!!!不过发现,网页的字符集类型采用的 gbk 编码格式。

我们知道 Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 r.encoding 属性来改变它。

接下来,我们一起通过 resquests 的一些用法,来看看 Requests 会基于 HTTP 头部对响应的编码方式。

print (res.encoding) #查看网页返回的字符集类型

print (res.apparent_encoding) #自动判断字符集类型

输出结果为:

html中文乱码问题 java怎么解决 html出现乱码怎么办_html中文乱码问题 java怎么解决_07

可以发现 Requests 推测的文本编码(也就是网页返回即爬取下来后的编码转换)与源网页编码不一致,由此可知其正是导致乱码原因。

乱码背后的奥秘

当源网页编码和爬取下来后的编码转换不一致时,如源网页为 gbk 编码的字节流,而我们抓取下后程序直接使用 utf-8 进行编码并输出到存储文件中,这必然会引起乱码,即当源网页编码和抓取下来后程序直接使用处理编码一致时,则不会出现乱码,此时再进行统一的字符编码也就不会出现乱码了。最终爬取的所有网页无论何种编码格式,都转化为 utf-8 格式进行存储。

注意:区分源网编码 A-gbk、程序直接使用的编码 B-ISO-8859-1、统一转换字符的编码 C-utf-8。