python編碼問題之”encode”&”decode”

marsggbo發表於2017-03-26
python
encode
decode
編碼

decode的作用是將其他編碼的字串轉換成unicode編碼,如str1.decode(‘gb2312’),表示將gb2312編碼的字串str1轉換成unicode編碼。

encode的作用是將unicode編碼轉換成其他編碼的字串,如str2.encode(‘gb2312’),表示將unicode編碼的字串str2轉換成gb2312編碼。

當我們想獲取網頁原始碼,並且希望能夠以html字尾或者其他格式儲存檔案的時候,如果不進行編碼,那麼儲存得到的檔案在遇到中文時就會出現異常,不便於我們對資料的處理。

  • requests

首先說一下使用requests請求得到原始碼的處理辦法。
經過我無數次的實踐,發現通過get請求得到的原始碼都是“byte”型別,所以每當想都過write寫入到檔案中時總是會報錯。如下:

  1. #coding=utf-8 
  2. import requests 
  3.  
  4. r = requests.get(`http://www.baidu.com`
  5.  
  6. print(type(r.text)) 
  7. with open(`baidu.html`,`w`as f: 
  8.     f.write(r.text) 

輸出結果

  1. >>> 
  2. <class `str`> 
  3. Traceback (most recent call last)
  4.   File “C:Users14356_000Desktop est.py”, line 8in <module> 
  5.     f.write(r.text) 
  6. UnicodeEncodeError: `gbk` codec can`t encode character `xbb` in position 25364: illegal multibyte sequence 

解決辦法:示例程式碼如下

  1.  
  2. import requests 
  3. import chardet 
  4.  
  5. r = requests.get(`http://www.baidu.com`
  6. content = r.text 
  7. print(type(content)) 
  8. print(chardet.detect(content.encode(`utf-8`))) 
  9. with open(`baidu.html`,`w`,encoding=`utf-8`as f: 
  10.     f.write(content.encode(`utf-8`).decode(`utf-8`)) 

注意chardet是用來檢視文字編碼型別的,之前想使用下面程式碼直接檢視content的編碼型別,但是報錯。

  1. … 
  2. … 
  3. print(chardet.detect(content)) 
  4.  
  5. >>> 
  6. Traceback (most recent call last): 
  7.   File “C:Users14356_000Desktop est.py”, line 8in <module> 
  8.     print(chardet.detect(content)) 
  9.   File “C:Python35libsite-packageschardet\__init__.py”, line 25in detect 
  10.     raise ValueError(`Expected a bytes object, not a unicode object`
  11. ValueError: Expected a bytes object, not a unicode object 

因此需要先通過encode,將content的編碼格式轉化為utf-8才能檢視。。這裡還沒弄清楚為什麼Expected a bytes object, not a unicode object,先放著。
下面說說寫入操作。寫入操作之前需要制定encoding的方式為utf-8,另外f.write()時還得先把content的編碼格式設定成utf-8,然後再通過decode解碼,將utf-8格式解碼成Unicode格式,即python內建的編碼格式,這樣就能正常寫入了,而且中文正常顯示!!!
下面是最上面程式碼的輸出結果。

  1. >>> 
  2. <class `str`> 
  3. {`encoding`: `utf-8``confidence`0.99
  4. [Finished in 2.3s] 
  • urllib

先寫到這~~~



相關文章