您的位置:首页 > 编程语言 > Python开发

python关于爬虫编码备忘

2015-08-30 22:31 471 查看
尝试用python写爬虫,用的是python2.7,个人感觉其他方面还好,就是编码格式方面太蛋疼了。关于python2.7的编码麻烦也可以在网上搜到。似乎python3就没有这种麻烦了(我没用过python3,只是听其他大牛讲的)。既然用了python2.7,那就得自己搞清楚编码格式咯。

首先引用一段材料,来自这里,还可以看看关于Unicode字符集

我们看到的所有字符,在计算机里面都是用01010101二进制编码,然后你要想在屏幕上看到ABCD,计算机需要指定某个特定的二进制串来对应ABCD,比如A是011,0100是B等,每个字母都代表一个独有的二进制串,起初计算机是美国人发明了,他们只考虑了0-9a-zA-Z以及一些简单符号,这些符号等用一个字节(8位)的二进制串就能代表全了,这就是所谓的ASCII编码,然而一个字节有2的8次方大小的容量,随着科技的发展,计算机遍及了世界,ASCII编码已经满足不了,所以后来中国、印度等其他国家自己制定了一套编码规则,才诞生的GBK等等一系列的编码,但是还不够统一,不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码,于是有人发明了一种万能的编码,unicode,一次性将全世界各种语言编码情况都包含进来了。

ASCII编码是1个字节,Unicode编码是2个字节;但是问题出来了,乱码是没了,但是如果你处理的文本中包含有大量的英文字符,用unicode编码要多占一半的空间,所以本着节约精神,UTF-8编码应运而生,UTF-8可变长编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间;所以我们可以这样理解:gbk和utf-8等编码格式就是unicode编码的子集,对其他任意格式的字符串进行解码操作都是让他们成为unicode编码,然后能随便你指定编码类型了,将它转了gbk也行,utf8也行。

大家注意黑体字部分,个人很受启发。我之前老是混淆utf-8和unicode这两种编码,我以为它们就是一种,其实并不是。unicode是一种编码格式,而utf-8是实现unicode的一种途径,还有utf-16、utf-32等等。

好了,说完基本的编码格式概念,接下来备忘一下在ubuntu14.04下用sublime text2来做python爬虫时遇到的一点问题和解决方案。

首先,sublime text默认的编码格式是unicode,用户可以自己改变编码格式,这个自己google去。这意味着你爬下来的gbk或者gb2312或各种其他编码格式的网页有可能会显示乱码。这时候就可以使用python自带的decode和encode来改变它的编码格式啦。那可能不知道它原来的编码格式是什么,可以用python的chardet来查看。

#coding:utf-8
import chardet
#抓取网页html
url = "http://www.***.com"
html_1 = urllib2.urlopen(url).read()
#print html_1
encoding_dict = chardet.detect(html_1)
#print encoding
encoding_format = encoding_dict['encoding']
#encoding_format就是编码格式
print encoding_format


上面是一种方法,还有一种更简单的就是直接打开网页的源代码,找到charset的值,就可以直接查看编码格式了。

在爬网页的时候,有时候会遇到字符串用unicode的内存编码值来储存的,这时候可以用unicode_string.decode(“unicode-escape”)来转换。还可以看看string-escape和unicode-escape的区别

而如果看到网页是以gbk来编码的话,就用decode(“gbk”, “ignore”)来转换就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: