今天在看中國大學MOOC好大學在線中Python網絡爬蟲與信息提取課程的時候,做了一個實例是關於中國大學排名定向爬蟲,我貼一下代碼:
#encoding:utf-8
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
r = requests.get(url,timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
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("排名","學校名稱","總分"))
for i in range(num):
u=ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))
def main():
uinfo =[]
url ='http://www.zuihaodaxue.com/zuihaodaxuepaiming2017.html'
html = getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,20)
main()
但是我在最後在運行的時候出現了
UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 1-4: ordinal not in range(128)
找了一下原因,因爲Python調用ascii編碼解碼程序去處理字符流,當字符流不屬於ascii範圍內,就會拋出異常(ordinal not in range(128)),但是很神奇的是python3.x是不會出現這個問題的,好吧,說好的python更加穩定呢?
那就找解決方法吧!
解決的方案很簡單,修改默認的編碼模式,我們可以通過sys.setdefaultencoding(‘utf-8’)來將當前的字符處理模式修改爲utf-8編碼模式,值得注意的是,如果單純這麼調用的話,Python會拋出一個AttributeError異常:需要調用一次reload(sys)。
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
然後,就ok了。
這位大神的解決方案