python在安装时,默认的编码是ascii。经常出现它无法处理非ascii编码的情况。此时需要手动修改它的编码字符集。
我们可以使用IDLE查询系统默认编码:
>>>import sys
>>>sys.getdefaultencoding()
修改默认编码,可以使用sys的setdefaultencoding方法
>>>import sys
>>>sys.getdefaultencoding()
>>>reload(sys)
>>>sys.setdefaultencoding('utf8)
记得要加载了sys模块才能进行set操作,否则会报错,就像上面那样。还有一个问题就是,关闭IDLE和CMD的时候,默认编码又变回ASCII。如果想把系统默认编码永久设置为utf-8,需要在Python安装目录的Lib\site-packages文件夹下创建一个sitecustomize.py,内容设置为:
#encoding = utf8
import sys
reload(sys)
sys.setdedaultencoding('utf8')
所以,我建议一般写程序时候在源程序头上加上上面的代码,就能解决默认编码问题。不然会出现下面的错误,这是我写爬虫的时候报的错误,当加上上面的代码就解决了。format内的u[0],u[1],u[2]是使用beautifulsoup库获取的内容,而beautifulsoup会自动把html文件解析成utf-8编码格式,而系统默认编码是ASCII,所以会报错,当修改系统编码为utf-8时,就解决了该问题。
下面附上我爬取中国大学排名网站的定向爬取代码:
# -*- 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("排名","学校名称","总分"))
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()