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中字符串的修改及传参详解
Nov 30 Python
python3中int(整型)的使用教程
Mar 23 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
Python中的单继承与多继承实例分析
May 10 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
如何使用Python标准库进行性能测试
Jun 25 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
使用pyqt5 tablewidget 单元格设置正则表达式
Dec 13 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
用pip给python安装matplotlib库的详细教程
Feb 24 Python
Python学习之异常中的finally使用详解
Mar 16 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
PHP4实际应用经验篇(4)
2006/10/09 PHP
兼容各大浏览器带关闭按钮的漂浮多组图片广告代码
2014/06/05 PHP
php生成百度sitemap站点地图类函数实例
2014/10/17 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
2016/05/31 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
2019/07/25 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
2020/08/24 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
工程概预算专业毕业生求职信
2013/10/04 职场文书
学校出纳员岗位职责
2014/03/18 职场文书
商铺门面租房协议书
2014/10/21 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
2019广播稿怎么写
2019/04/17 职场文书
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python
10大幻兽系恶魔果实 蝙蝠果实上榜,第一自愈能力强
2022/03/18 日漫
Elasticsearch 配置详解
2022/04/19 Java/Android