編碼問題
因為涉及到中文,所以必然地涉及到了編碼的問題,這一次借這個機會算是徹底搞清楚了。
問題要從文字的編碼講起。原本的英文編碼只有0~255,剛好是8位1個字節(jié)。為了表示各種不同的語言,自然要進行擴充。中文的話有GB系列。可能還聽說過Unicode和UTF-8,那么,它們之間是什么關系呢?
Unicode是一種編碼方案,又稱萬國碼,可見其包含之廣。但是具體存儲到計算機上,并不用這種編碼,可以說它起著一個中間人的作用。你可以再把Unicode編碼(encode)為UTF-8,或者GB,再存儲到計算機上。UTF-8或者GB也可以進行解碼(decode)還原為Unicode。
在python中Unicode是一類對象,表現(xiàn)為以u打頭的,比如u'中文',而string又是一類對象,是在具體編碼方式下的實際存在計算機上的字符串。比如utf-8編碼下的'中文'和gbk編碼下的'中文',并不相同??梢钥慈缦麓a:
代碼如下:
>>> 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是字節(jié)串
文件編碼
既然有不同的編碼,那么如果在代碼文件中直接寫string的話,那么它到底是哪一種編碼呢?這個就是由文件的編碼所決定的。文件總是以一定的編碼方式保存的。而python文件可以寫上coding的聲明語句,用來說明這個文件是用什么編碼方式保存的。如果聲明的編碼方式和實際保存的編碼方式不一致就會出現(xiàn)異常。可以見下面例子: 以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)
輸出正常結(jié)果 u'/u6c49' '/xe6/xb1/x89' '/xba/xba' '/xe6/xb1/x89'
基本方法
其實用python爬取網(wǎng)頁很簡單,只有簡單的幾句話
代碼如下:
import urllib2
page=urllib2.urlopen('url').read()
這樣就可以獲得到頁面的內(nèi)容。接下來再用正則匹配去匹配所需要的內(nèi)容就行了。
新聞熱點
疑難解答
圖片精選