解决python爬虫乱码问题及.text与.content的区别

文章目录

  • 遇到问题
  • 解决方法1:通过response.apparent_encoding属性指定
  • 解决方法2:直接指定response.encoding
  • 解决方法3:通过response.content.decode('')
  • 解决方法4:通过编码、解码方式respons.text.encode().decode()
  • text与content的补充
    • 1 text与content
    • 2 encode与decode
  • 致谢

遇到问题

爬取某网站(不便透露)的帖子过程中,发现数据解析不对,中文乱码,或者只能解析出一半的中文。
开发者模式查看到charset="gbk"
然而该网页的编码方式如下:

response = requests.get(test_url)

print(response.encoding) #查看网页返回的字符集类型
print(response.apparent_encoding) #自动判断字符集类型

输出为:

ISO-8859-1
GB2312

enconding是从http从中猜测的响应内容编码方式,若header中没有charset字段则默认为ISO-8859-1编码模式,则无法解析中文。
apparent——encoding是从内容中分析出的响应内容编码方式。

因此,requess模块猜测网页的编码方式与实际的编码方式不同,网页申明的编码方式是gbk。

尝试输出print(response.text[:1000]),结果如下
解决python爬虫乱码问题及.text与.content的区别_第1张图片

再尝试输出print(response.text[:1000])结果如下:
解决python爬虫乱码问题及.text与.content的区别_第2张图片

解决方法1:通过response.apparent_encoding属性指定

试试:response.encoding = response.apparent_encoding

apparent_encoding比encoding更加准确,当网页出现乱码时可以试试把apparent_encoding的编码格式赋值给encoding

# response.encoding = response.apparent_encoding
# refer: https://q.cnblogs.com/q/117003/
response.encoding = response.apparent_encoding
print(response.text[:500])
print("---------------")
print(response.content[:500])

但它没解决我遇到的问题:
解决python爬虫乱码问题及.text与.content的区别_第3张图片

解决方法2:直接指定response.encoding

再试试其他方法:

response.encoding='gbk'
print(response.text)

测试可行:
解决python爬虫乱码问题及.text与.content的区别_第4张图片

response.encoding='utf-8'不行解决python爬虫乱码问题及.text与.content的区别_第5张图片

解决方法3:通过response.content.decode(’’)

这里有个有意思的东西叫chardet,可以根据response的内容猜测最有可能的编码方式,结果和前面的response.apparent_enconding的结果一致,都是“GB2312”

使用如下命令:
response.content.decode('GBK')(为什么使用GBK,而不是GB2312可以查看网页编码那点事)解决python爬虫乱码问题及.text与.content的区别_第6张图片

解决方法4:通过编码、解码方式respons.text.encode().decode()

import requests
test_url = '不便透露'
response = requests.get(test_url)

print(response.encoding)
print(response.apparent_encoding)
print(response.text.encode('iso-8859-1').decode('gbk'))

输出如下:

ISO-8859-1
GB2312

解决python爬虫乱码问题及.text与.content的区别_第7张图片

text与content的补充

1 text与content

  • text 返回的是unicode 型的数据,一般是在网页的header中定义的编码形式,如果想要提取文本就用text。

  • content返回的是bytes,二级制型的数据。直接输出content,会发现前面存在b’这样的标志,这是字节字符串的标志。但是如果你想要提取图片、文件,就要用到content

一般来说 .text直接用比较方便,返回的是字符串,但是有时候会解析不正常,导致返回的是一堆乱码。这时需要用.content.decode(‘utf-8’),使其正常显示。

总的来说.text是现成的字符串,.content还要编码,但是.text不是所有时候显示都正常(需要用.content.decode()进行手动编码)(前面的解决方法3)

2 encode与decode

.text与.content,与decode、encode的关系
res.text是string类型,也是Unicode编码,通过encode可以转成bytes类型;
res。content是bytes类型,通过decode可以解码成string类型
解决python爬虫乱码问题及.text与.content的区别_第8张图片

致谢

最后,感谢以下博主的文章:
别人的回复可以参考:爬虫爬下来的怎么都是乱码…
最后两个方法很不错:Python爬虫中文乱码问题
讲清楚了ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE的关系:网页编码就是那点事
Python爬虫的一次提问,引发的“乱码”问题
Python获取爬虫数据, r.text 与 r.content 的区别
Python 3的bytes/str之别

你可能感兴趣的:(爬虫)