编码问题
因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了。
问题要从文字的编码讲起。原本的英文编码只有0~255,刚好是8位1个字节。为了表示各种不同的语言,自然要进行扩充。中文的话有GB系列。可能还听说过Unicode和UTF-8,那么,它们之间是什么关系呢?
Unicode是一种编码方案,又称万国码,可见其包含之广。但是具体存储到计算机上,并不用这种编码,可以说它起着一个中间人的作用。你可以再把Unicode编码(encode)为UTF-8,或者GB,再存储到计算机上。UTF-8或者GB也可以进行解码(decode)还原为Unicode。
在python中Unicode是一类对象,表现为以u打头的,比如u'中文',而string又是一类对象,是在具体编码方式下的实际存在计算机上的字符串。比如utf-8编码下的'中文'和gbk编码下的'中文',并不相同。可以看如下代码:
代码如下:
>>> str=u'中文'
>>> str1=str.encode('utf8')
>>> str2=str.encode('gbk')
>>> print repr(str)
u'/u4e2d/u6587'
>>> print repr(str1)
'/xe4/xb8/xad/xe6/x96/x87'
>>> print repr(str2)
'/xd6/xd0/xce/xc4'
可以看到,其实存储在计算机中的只是这样的编码,而不是一个一个的汉字,在print的时候要知道当时是用的什么样的编码方式,才能正确的print出来。有一个说法提得很好,python中的Unicode才是真正的字符串,而string是字节串
文件编码
既然有不同的编码,那么如果在代码文件中直接写string的话,那么它到底是哪一种编码呢?这个就是由文件的编码所决定的。文件总是以一定的编码方式保存的。而python文件可以写上coding的声明语句,用来说明这个文件是用什么编码方式保存的。如果声明的编码方式和实际保存的编码方式不一致就会出现异常。可以见下面例子: 以utf-8保存的文件声明为gbk
代码如下:
#coding:gbk
str=u'汉'
str1=str.encode('utf8')
str2=str.encode('gbk')
str3='汉'
print repr(str)
print repr(str1)
print repr(str2)
print repr(str3)
提示错误 File "test.py", line 1 SyntaxError: Non-ASCII character '/xe6' in file test.py on line 1, but no encodi ng declared; see http://www.python.org/peps/pep-0263.html for details 改为
代码如下:
#coding:utf8
str=u'汉'
str1=str.encode('utf8')
str2=str.encode('gbk')
str3='汉'
print repr(str)
print repr(str1)
print repr(str2)
print repr(str3)
输出正常结果 u'/u6c49' '/xe6/xb1/x89' '/xba/xba' '/xe6/xb1/x89'
基本方法
其实用python爬取网页很简单,只有简单的几句话
代码如下:
import urllib2
page=urllib2.urlopen('url').read()
这样就可以获得到页面的内容。接下来再用正则匹配去匹配所需要的内容就行了。
新闻热点
疑难解答