1. 程式人生 > >Python 抓取網頁學習系列之一(網頁編碼格式

Python 抓取網頁學習系列之一(網頁編碼格式

第一步:你需要知道你所抓取的網頁編碼格式,方法:右鍵檢視網頁編碼,ctrl +F ,搜尋:charset
會看到:<meta http-equiv="Content-Type" content="text/html; charset=gbk" />,OK確定是gbk編碼格式了;
為什麼會提到編碼,這裡大概講講原理:
    我們看到的所有字元,在計算機裡面都是用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也行。
    而這裡,為什麼那麼多人的電腦可能打印出來的中文不同呢,例如print '中國',有些人是直接展示編碼,有些人是直接展示中文,這是跟他當時環境息息相關的,比如sublime預設的編碼格式是utf-8,cmd預設是gbk編碼等等,下面會講到原因;
    繼續開始講網頁抓取,要檢視編碼格式,發現是gbk格式的,抓取時候,你的python系統是不認識,你的sublime系統也是不認識的,這裡就需要把gbk格式解碼成系統認識的unicode編碼,解碼方式:a.decode('gbk'),他的意思是對a這個字串根據gbk的形式進行解碼為unicode,注意這裡是如果你打印出來,不一定就是你想要的中文,還需要指定編碼格式,a.encode('gbk')的意思是對a這個字串gbk編碼,上面提到這個a字串必須是unicode編碼前提下才能encode;encode後就會按照你想要的編碼格式輸出了。如果你用cmd除錯,可以不用加上encode,因為cmd預設的編碼格式是gbk了,但你用sublime就不一定了,所以跟系統環境關係很大的。
    這裡通俗的可以這樣理解:

    你在處理包含中文或者其他什麼編碼的字串的時候,用一個鐵則,首先將它解碼成unicode,然後對解碼後的unicode字串進行操作;
    下面給個例子:

點選(此處)摺疊或開啟

  1. #-*-coding:utf-8-*-
  2. import urllib
  3. import re
  4. def getchapids(url_m):
  5.     html = urllib.urlopen(url_m).read()
  6.     details = html.decode("gbk").encode("utf-8")
  7.     reg = r'<dd><a href="\/6_6919\/(.*?)\">'
  8.     ids = re.findall(reg,details)
  9.     sd = ids[:9]
  10.     for s in sd:
  11.         ids.remove(s)
  12.     return ids
這個測試Url是:http://www.biquge.com/6_6919,下面的正則可以不用看。看decode和encode那行。然後你輸出details就是有中文正常顯示;
    再一個例子:

點選(此處)摺疊或開啟

  1. #-*-coding:utf-8-*-
  2. import urllib
  3. import re
  4. def getchapids(url_m):
  5.     html = urllib.urlopen(url_m).read()
  6.     details = html.decode("gbk")
  7.     with open("text.txt","w")as f:
  8.         f.write(details.encode("utf-8"))
如果想寫入文字也是中文,就需要在寫入時候encode,不然寫進去的是decode後的unicode編碼格式文字;

先寫到這裡,後面還會寫網頁抓取的其他內容,如有不正之處請指正;晚安好夢!