Python——系统编码问题

2017-03-15  本文已影响125人  帅气的_xiang

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()

上一篇下一篇

猜你喜欢

热点阅读