python抓取網頁,字符集轉換

英文很差學起來挺困難的,其中小弟就遇到一個十分蛋疼的問題,百度了半天就沒找到解決辦法~囧~ html

摸索了半天本身解決了,記錄下來與君共勉。 python

問題提出: 數據庫

    有時候咱們採集網頁,處理完畢後將字符串保存到文件或者寫入數據庫,這時候須要制定字符串的編碼,若是採集網頁的編碼是gb2312,而咱們的數據庫是utf-8的,這樣不作任何處理直接插入數據庫可能會亂碼(沒測試過,不知道數據庫會不會自動轉碼),咱們須要手動將gb2312轉換成utf-8。 函數

首先咱們知道,python裏的字符默認是ascii碼,英文固然沒問題啦,碰到中文的時候立馬給跪。 測試

不知道你還記不記得,python裏打印中文漢字的時候須要在字符串前面加 u: 編碼

print u"來搞基嗎?"
這樣子中文才能顯示,這裏面的u的做用就是將後面的字符串轉換爲unicode碼,這樣中文才能獲得正確的顯示。

這裏與之相關的有一個unicode()函數,用法以下 url

str="來搞基"
str=unicode(str,"utf-8")
print str
與u的區別是,這裏用unicode將str轉換爲unicode編碼,須要正確指定第二個參數,這裏的utf-8是我test.py腳本自身的文件字符集,默認的多是ansi。

unicode這是一個關鍵,下面繼續 spa

咱們開始抓取百度首頁,注意,遊客訪問百度首頁,查看網頁源代碼,它的charset=gb2312。 code

import urllib2
def main():
    f=urllib2.urlopen("http://www.baidu.com")
    str=f.read()
    str=unicode(str,"gb2312")
    fp=open("baidu.html","w")
    fp.write(str.encode("utf-8"))
    fp.close()

if __name__ == '__main__' :
    main()
解釋:

咱們首先用urllib2.urlopen()方法將百度首頁抓取到,f是句柄 ,用str=f.read()將全部源代碼讀入str中 htm

搞清楚,str裏面就是咱們抓取的html源代碼,因爲網頁默認的字符集是gb2312,因此若是咱們直接保存到文件中,文件編碼將是ansi。

對於大部分人來講,其實這就足夠了,可是有時候我就想把gb2312轉換成utf-8的該怎麼辦呢?

首先:
    str=unicode(str,"gb2312") #這裏的gb2312就是str的實際字符集,咱們如今將其轉換成unicode

而後:
    str=str.encode("utf-8") #將unicode的字符串從新編碼成utf-8

最後:

    將str寫入到文件中,打開文件看一下編碼屬性,發現是utf-8的了,把<meta charset="gb2312"改爲<meta charset="utf-8" ,就是一個utf-8的網頁了。作了這麼多其實就完成了一個gb2312->utf-8的轉碼。


總結:

    咱們回顧一下,若是須要將字符串按照指定的字符集保存,有如下幾個步驟:

    1:用unicode(str,"原來的編碼")將str解碼成unicode字符串

    2:將unicode字符串str 使用 str.encode("指定的字符集") 轉換成你指定的字符集

    3:將str保存文件,或者寫入數據庫等操做,固然,編碼你已經指定了,不是嗎?

相關文章
相關標籤/搜索