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函数中*args和**kwargs来传递变长参数的用法
Jan 26 Python
Python生成随机数组的方法小结
Apr 15 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
利用python编写一个图片主色转换的脚本
Dec 07 Python
python基础教程项目四之新闻聚合
Apr 02 Python
详解python3中tkinter知识点
Jun 21 Python
Django使用paginator插件实现翻页功能的实例
Oct 24 Python
python正则表达式匹配[]中间为任意字符的实例
Dec 25 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
Django的Modelforms用法简介
Jul 27 Python
python 列表推导式使用详解
Aug 29 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
用PHP实现读取和编写XML DOM代码
2010/04/07 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
js检测输入内容全为空格的方法
2014/05/03 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
js漂浮广告实现代码
2015/08/15 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
JavaScript中Date对象的常用方法示例
2015/10/24 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
NodeJS父进程与子进程资源共享原理与实现方法
2018/03/16 NodeJs
JavaScript同源策略和跨域访问实例详解
2018/04/03 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
vue实现简单学生信息管理
2020/05/30 Javascript
[04:19]DOTA2亚洲邀请赛 现场花絮
2015/03/11 DOTA
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
python排序方法实例分析
2015/04/30 Python
浅谈Python中的闭包
2015/07/08 Python
python处理数据,存进hive表的方法
2018/07/04 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
Python创建数字列表的示例
2019/11/28 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
应届生骨科医生求职信
2013/10/31 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
Nginx配置使用详解
2022/07/07 Servers