【爬虫】编码或解码(decode,encode)报异常的处理方式
1 经常出现的问题
- 网页中的编码明明写着charset=‘utf-8’,
- urllib.request.urlopen(【url】).read().decode(‘utf-8’) 竟然报错
- 无界面浏览器可以通过driver.page_source取得浏览器中的源码
- 一般windows环境下部署的无界面取page_source不报错,但在centos7下部署的,也容易报编码错误
针对这两种情况,举两个最简单的方法
2 解决方法
2.1 网页返回的源码decode失败
import urlib.request as ur
response_b = ur.urlopen(【URL】).read() # 返回字节
response_str = response_b.decode("utf-8","ignore") # 忽略非法字符
decode(encoding,errors=‘strict’)
errors常见取值 | 说明 |
---|---|
strict | 非法字符报异常 |
ignore | 忽略非法字符 |
replace | ?替换非法字符 |
2.2 selinum取page_source出现异常
from selenium import webdriver
# 实例化driver
driver = webdriver.Chrome(
executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe',
)
driver.get('http://www.baidu.com')
try:print(dirver.page_source)
except:pass
page_source = driver.page_source.encode('utf-8','ignore') # 加入这句话
print(page_source)
3 估测字节编码
对于一个字节数据,我们不知道他的编码方式,可以使用chardet,来返回最有可能的编码方式
3.1 安装chardet
pip install chardet
3.2 使用案例
import chardet
obj_str = '中文'
obj_b = obj_str.encode('utf-8')
ret = chardet.detect(obj_b)
print(ret)
输出结果:
{‘encoding’: ‘utf-8’, ‘confidence’: 0.7525, ‘language’: ‘’}
obj_b最有可能是utf-8编码,把握度是0.7525