解決Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode異常錯誤

原文鏈接:https://blog.csdn.net/rhx_qiuzhi/article/details/80208458

        在學習requests庫爬取網頁的時候,出現了“解決Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode異常錯誤”的錯誤。

# -*-coding:utf-8-*-
 
import requests
from bs4 import BeautifulSoup
import bs4
 
def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ''
 
def fillUnivList(ulist, html):
    soup = BeautifulSoup(html, 'html.parser')
    for tr in soup.find('tbody').children:
        if isinstance(tr, bs4.element.Tag):
            tds = tr('td')
            ulist.append([tds[0].string, tds[1].string, tds[2].string])
 
def printUnivList(ulist, num):
    print('{:^10}\t{:^6}\t{:^10}'.format('range', 'University', 'score'))
    for i in range(num):
        u = ulist[i]
        print('{:^10}\t{:^6}\t{:^10}'.format(u[0], u[1], u[2]))
    # print('Suc'+str(num))
 
def main():
    uinfo = []
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)
 
#main()
if __name__ == '__main__':
    main()


代碼上面應該沒有什麼問題,Python使用的是版本2.7,但是在運行的時候出現了異常錯誤UnicodeEncodeError,輸出結果:

從出錯原因來看,大致是因爲編碼的問題,因爲輸出的內容中有中文,Unicode嘛與ASCII碼不兼容,由於這個腳本使用的是utf-8編碼的,但是python的默認編碼方式爲Ascii碼,可以通過以下命令進行查詢:

>>> import sys
>>> print sys.getdefaultencoding()
ascii


因爲Ascii的範圍爲0-128,默認爲Ascii,故而python在處理的時候自然調用Ascii碼進行處理,因此在處理漢字的時候就超出了Ascii的範圍,從而拋出ordinal not in range的異常錯誤。

     那如何修改呢?

通過修改默認額編碼方式,即修改 setdefaultencoding 

import sys
sys.setdefaultencoding('utf-8')


但是 setdefaultencoding 就是 sys 的方法,其實是這裏的 sys.setdefaultencoding('utf-8')沒有生效的原因,因爲在python27/Lib/目錄下,在site.py文件中:

    # Remove sys.setdefaultencoding() so that users cannot change the
    # encoding after initialization.  The test for presence is needed when
    # this module is run as a script, because this code is executed twice.
    if hasattr(sys, "setdefaultencoding"):
        del sys.setdefaultencoding


爲什麼要查看site.py文件呢,因爲在加載python模塊的時候,會加載site.py模塊

C:\Users\rhx>python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# C:\Python27\lib\site.pyc matches C:\Python27\lib\site.py


因此第一次導入後,再次sys.setdefaultencoding執行的時候會被刪除,所以需要重新導入一次 reload(os)。明白原理之後,這樣就有兩種方式設置python的默認編碼了。

1、設置爲 utf-8 的編碼格式

import sys  
reload(sys)  
sys.setdefaultencoding('utf8') 


2、在python的Lib\site-packages文件夾下新建一個sitecustomize.py,內容爲

# encoding=utf8  
import sys  
  
reload(sys)  
sys.setdefaultencoding('utf8')   


此時重啓python解釋器,執行sys.getdefaultencoding(),發現編碼已經被設置爲utf8的了,多次重啓之後,效果相同,這是因爲系統在python啓動的時候,自行調用該文件,設置系統的默認編碼,而不需要每次都手動的加上解決代碼,屬於一勞永逸的解決方法。

這樣在模塊的開始部分加入以上設置即可。
 ———————————————— 
版權聲明:本文爲CSDN博主「止語---」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/rhx_qiuzhi/article/details/80208458

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章