Python3 關於UnicodeDecodeError/UnicodeEncodeError: ‘gbk’ codec can’t decode/encode bytes類似的文本編碼問題


  以下是小白的爬蟲學習歷程中遇到並解決的一些困難,希望寫出來給后來人,如有疏漏懇請大牛指正,不勝感謝!

  首先,我的代碼是這樣的

1 
2 
3 import requests
4 
5 url = 'http://www.acfun.tv/' 
6 html = requests.get(url)
7 
8 print(html.text)

 

python2中解決方法(題外話)

參考:http://www.cnblogs.com/zhaoyl/p/3770340.html

在前面加上以下代碼即可

import sys 
reload(sys) # Python2.5 初始化后會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入 
sys.setdefaultencoding('utf-8')

一般就能解決了

 

 

而在Python3中:

如果在控制台中運行,就遇到了如下的UnicodeEncodeError:

  

 

1.原因

  #參考了http://www.tuicool.com/articles/nEjiEv

  首先,代碼中的html.text會自動將獲取的內容解析為unicode  (與html.content不同。兩者區別就是html.content的類型是bytes,而html.text類型是str,bytes通過解碼(decode)可以得到str,str通過編碼(encode)得到bytes)    html.text這種字符串如果要輸出應當用utf-8來編碼。而cmd中,(對於多數中國人所用的是中文的系統)默認字符編碼是gbk

  從而導致此種現象:

  python要將utf-8編碼的字符串,在gbk的cmd的中打印出來。於是出現了編碼錯誤

2.解決方法

   1. 運行CMD;

     2. 輸入 CHCP,回車查看當前的編碼;

     3. 輸入CHCP 65001(序號65001代表utf-8),回車;

     4. 僅如此,還是不能支持UTF8的正常顯示,你還要在窗體上右鍵,選擇屬性,來設置字體;

     5. 操作完上面幾步后,即使你原來的字體里面沒有顯示Lucida Console這個字體,現在應該也能看到了。選擇它。如果原來就有,可以選上它先試試,不行在執行上述步驟。

    (參考http://blog.useasp.net/archive/2012/04/24/how_to_use_UTF8_encoding_in_Windows_CMD.aspx)

如果還是不懂,請自行百度:在cmd上顯示utf-8。

     

你也可以使用Pycharm這個IDE來運行查看結果,中文部分就能正常顯示了。

  

 

  

 

寫入文件時引發的UnicodeEncodeError:

參考:https://segmentfault.com/a/1190000004269037

  在測試過程中多次出現在寫入文件時報告錯誤“UnicodeEncodeError: 'ascii' codec can't encode character '\u56de' in position 0: ordinal not in range(128)”,這是由於我們在抓取網頁的時候采用的是UTF-8編碼,而存儲時沒有指定編碼,在存儲到文件的過程中就會報錯

  解決辦法為:
在讀取文件時加入指定UTF-8編碼的選項

f = open('content.txt','a',encoding='UTF-8')

 

另外需要注意的是使用requests獲取到網頁之后同樣要指定編碼

html = requests.get(url)
html = re.sub(r'charset=(/w*)', 'charset=UTF-8', html.text)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM