Python进行数据乱码处理
编码问题
我们在爬取网页时,结果会出现乱码,这是因为编码不一致的原因导致的。
import requests
url = 'https://www.baidu.com'
res = requests.get(url).text
print(res)
运行结果为:
编码分析
为了爬取到正确的网页,我们要进行分析编码是否一致。
import requests
url = 'https://www.baidu.com'
code = requests.get(url).encoding
print(code)
输出结果为:
ISO-8859-1
我们可以看倒网页源代码的编码方式为ISO-8859-1。
那我们通过之前讲解的通过开发者工具可以查看网页的编码方式:
其中的< meta >中charset的参数设置就是该网页的编码方式,可以发现是utf-8(utf-8支持中文编码,而ISO-8859-1属于单字节编码,应用于英文系列)那么就需要我们进行重新编码。
重新编码和解码
import requests
url = 'https://www.baidu.com'
res = requests.get(url).text
res = res.encode('ISO-8859-1').decode('utf-8')
先通过encode()函数进行编码,将获取的ISO-8859-1的内容转换为二进制字符,然后通过decode()函数进行解码,变成了对应网页的utf-8编码方式。
输出结果:
encode()与decode()
encode()就是将字符转换为二进制如:
res = '百度'
res = res.encode('utf-8')
print(res)
输出:
b’\xe7\x99\xbe\xe5\xba\xa6’
decode()就是将二进制转化为对应字符:
a = b'\xe7\x99\xbe\xe5\xba\xa6'
a = a.decode('utf-8')
print(a)
输出:
百度
解决乱码问题的经验
我们除了常见的utf-8外,中文网页还有gbk编码方式很常见。
我们在进行解决问题时可以分为以下三个步骤:
第一:
对于大多数网页我们可以先进行常规爬取看是否有乱码:
res = requests.get(url).text
第二:
若无乱码可直接用,若有则先进行一次转换。
res = requests.get(url).text
res = res.encode('ISO-8859-1').decode('utf-8')
第三:
若还不行或者报错可以换一种。
res = requests.get(url).text
res = res.encode('ISO-8859-1').decode('gbk')
我们还可以通过try/except进行整合:
res = requests.get(url).text
try:
res = res.encode('ISO-8859-1').decode('utf-8')
except:
try:
res = res.encode('ISO-8859-1').decode('gbk')
except:
res = res