在學習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