python在安裝時(shí),默認(rèn)的編碼是ascii。經(jīng)常出現(xiàn)它無(wú)法處理非ascii編碼的情況。此時(shí)需要手動(dòng)修改它的編碼字符集。
我們可以使用IDLE查詢(xún)系統(tǒng)默認(rèn)編碼:

>>>import sys
>>>sys.getdefaultencoding()
修改默認(rèn)編碼,可以使用sys的setdefaultencoding方法

>>>import sys
>>>sys.getdefaultencoding()
>>>reload(sys)
>>>sys.setdefaultencoding('utf8)
記得要加載了sys模塊才能進(jìn)行set操作,否則會(huì)報(bào)錯(cuò),就像上面那樣。還有一個(gè)問(wèn)題就是,關(guān)閉IDLE和CMD的時(shí)候,默認(rèn)編碼又變回ASCII。如果想把系統(tǒng)默認(rèn)編碼永久設(shè)置為utf-8,需要在Python安裝目錄的Lib\site-packages文件夾下創(chuàng)建一個(gè)sitecustomize.py,內(nèi)容設(shè)置為:
#encoding = utf8
import sys
reload(sys)
sys.setdedaultencoding('utf8')
所以,我建議一般寫(xiě)程序時(shí)候在源程序頭上加上上面的代碼,就能解決默認(rèn)編碼問(wèn)題。不然會(huì)出現(xiàn)下面的錯(cuò)誤,這是我寫(xiě)爬蟲(chóng)的時(shí)候報(bào)的錯(cuò)誤,當(dāng)加上上面的代碼就解決了。format內(nèi)的u[0],u[1],u[2]是使用beautifulsoup庫(kù)獲取的內(nèi)容,而beautifulsoup會(huì)自動(dòng)把html文件解析成utf-8編碼格式,而系統(tǒng)默認(rèn)編碼是ASCII,所以會(huì)報(bào)錯(cuò),當(dāng)修改系統(tǒng)編碼為utf-8時(shí),就解決了該問(wèn)題。


下面附上我爬取中國(guó)大學(xué)排名網(wǎng)站的定向爬取代碼:
# -*- coding: utf-8 -*-
importrequests
frombs4importBeautifulSoup
importbs4
importre
importsys
reload(sys)
sys.setdefaultencoding('utf8')
defgetHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
returnr.text
except:
return""
deffillUnivList(ulist,html):
soup = BeautifulSoup(html,"html.parser")
fortrinsoup.find('tbody').children:
ifisinstance(tr,bs4.element.Tag):
tds = tr.find_all('td')
(.*?)
ulist.append([str_rank,tds[1].string,tds[3].string])
defprintUnivList(ulist,num):
print("{:^10}\t{:^6}\t{:^10}".format("排名","學(xué)校名稱(chēng)","總分"))
foriinrange(num):
u = ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
print("Suc"+str(num))
defmain():
uinfo = []
url ="http://www.zuihaodaxue.cn/zuihaodaxuepaiming2017.html"
html = getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,20)#20 univs
if__name__ =='__main__':
main()