Python网络爬虫出现乱码问题的解决方法


Posted in Python onJanuary 05, 2017

关于爬虫乱码有很多各式各样的问题,这里不仅是中文乱码,编码转换、还包括一些如日文、韩文 、俄文、藏文之类的乱码处理,因为解决方式是一致的,故在此统一说明。

网络爬虫出现乱码的原因

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

注意区分

  • 源网编码A、
  • 程序直接使用的编码B、
  • 统一转换字符的编码C。

乱码的解决方法

确定源网页的编码A,编码A往往在网页中的三个位置

1.http header的Content-Type
获取服务器 header 的站点可以通过它来告知浏览器一些页面内容的相关信息。 Content-Type 这一条目的写法就是 "text/html; charset=utf-8"。

2.meta charset

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

3.网页头中Document定义

<script type="text/javascript"> 
if(document.charset){ 
 alert(document.charset+"!!!!"); 
 document.charset = 'GBK'; 
 alert(document.charset); 
} 
else if(document.characterSet){ 
 alert(document.characterSet+"????"); 
 document.characterSet = 'GBK'; 
 alert(document.characterSet); 
}

在获取源网页编码时,依次判断下这三部分数据即可,从前往后,优先级亦是如此。
以上三者中均没有编码信息 一般采用chardet等第三方网页编码智能识别工具来做

安装: pip install chardet

官方网站: http://chardet.readthedocs.io/en/latest/usage.html

Python chardet 字符编码判断

使用 chardet 可以很方便的实现字符串/文件的编码检测 虽然HTML页面有charset标签,但是有些时候是不对的。那么chardet就能帮我们大忙了。
chardet实例

import urllib 
rawdata = urllib.urlopen('https://3water.com/').read() 
import chardet 
chardet.detect(rawdata) 
{'confidence': 0.99, 'encoding': 'GB2312'}

chardet可以直接用detect函数来检测所给字符的编码。函数返回值为字典,有2个元素,一个是检测的可信度,另外一个就是检测到的编码。

在开发自用爬虫过程中如何处理汉字编码?
下面所说的都是针对python2.7,如果不加处理,采集到的都是乱码,解决的方法是将html处理成统一的utf-8编码 遇到windows-1252编码,属于chardet编码识别训练未完成

import chardet 
a='abc' 
type(a) 
str 
chardet.detect(a) 
{'confidence': 1.0, 'encoding': 'ascii'} 
 
 
a ="我" 
chardet.detect(a) 
{'confidence': 0.73, 'encoding': 'windows-1252'} 
a.decode('windows-1252') 
u'\xe6\u02c6\u2018' 
chardet.detect(a.decode('windows-1252').encode('utf-8')) 
type(a.decode('windows-1252')) 
unicode 
type(a.decode('windows-1252').encode('utf-8')) 
str 
chardet.detect(a.decode('windows-1252').encode('utf-8')) 
{'confidence': 0.87625, 'encoding': 'utf-8'} 
 
 
a ="我是中国人" 
type(a) 
str 
{'confidence': 0.9690625, 'encoding': 'utf-8'} 
chardet.detect(a) 
# -*- coding:utf-8 -*- 
import chardet 
import urllib2 
#抓取网页html 
html = urllib2.urlopen('https://3water.com/').read() 
print html 
mychar=chardet.detect(html) 
print mychar 
bianma=mychar['encoding'] 
if bianma == 'utf-8' or bianma == 'UTF-8': 
 html=html.decode('utf-8','ignore').encode('utf-8') 
else: 
 html =html.decode('gb2312','ignore').encode('utf-8') 
print html 
print chardet.detect(html)

python代码文件的编码
py文件默认是ASCII编码,中文在显示时会做一个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character。需要在代码文件的第一行添加编码指示:

# -*- coding:utf-8 -*- 
 
print '中文'

像上面那样直接输入的字符串是按照代码文件的编码'utf-8'来处理的
如果用unicode编码,以下方式:

s1 = u'中文' #u表示用unicode编码方式储存信息

decode是任何字符串具有的方法,将字符串转换成unicode格式,参数指示源字符串的编码格式。
encode也是任何字符串具有的方法,将字符串转换成参数指定的格式。

更多内容请参考专题《python爬取功能汇总》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python模块学习 filecmp 文件比较
Aug 27 Python
Python计算三角函数之asin()方法的使用
May 15 Python
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
Python Queue模块详细介绍及实例
Dec 27 Python
python爬虫面试宝典(常见问题)
Mar 02 Python
python匿名函数的使用方法解析
Oct 10 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
pycharm实现print输出保存到txt文件
Jun 01 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
Python如何在bool函数中取值
Sep 21 Python
Python基础之pandas数据合并
Apr 27 Python
golang特有程序结构入门教程
Jun 02 Python
python fabric实现远程部署
Jan 05 #Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 #Python
python 捕获shell脚本的输出结果实例
Jan 04 #Python
完美解决Python2操作中文名文件乱码的问题
Jan 04 #Python
python去除空格和换行符的实现方法(推荐)
Jan 04 #Python
python去掉行尾的换行符方法
Jan 04 #Python
python对json的相关操作实例详解
Jan 04 #Python
You might like
当海贼王变成JOJO风
2020/03/02 日漫
咖啡常见的种类
2021/03/03 新手入门
qq登录,新浪微博登录接口申请过程中遇到的问题
2014/07/22 PHP
php截取字符串函数分享
2015/02/02 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
php面向对象程序设计中self与static的区别分析
2019/05/21 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
IE8对JS通过属性和数组遍历解析不一样的地方探讨
2013/05/06 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
图解javascript作用域链
2019/05/27 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
2020/04/14 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python的迭代器和生成器
2015/07/29 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
pytorch1.0中torch.nn.Conv2d用法详解
2020/01/10 Python
安装多个版本的TensorFlow的方法步骤
2020/04/21 Python
python中threading开启关闭线程操作
2020/05/02 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
创业计划书之校园超市
2019/09/12 职场文书
浅谈MySQL之浅入深出页原理
2021/06/23 MySQL
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server
代码复现python目标检测yolo3详解预测
2022/05/06 Python