按照惯例先吟诗一首:

1
2
3
4
5
芙蓉楼送辛渐
(唐代:王昌龄)
寒雨连江夜入吴,平明送客楚山孤。
洛阳亲友如相问,一片冰心在玉壶。

1、解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误

最近练习Python爬虫的时候遇到一个错误,先上解决错误前的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# coding:utf-8
import urllib2
import sysfrom bs4 import BeautifulSoup
import uniout
from quote import Quote
class Xianqian:
def __init__(self):
self.url = 'http://www.juzimi.com/先秦'
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
def get_writer(self):
# reload(sys)
# sys.setdefaultencoding('utf-8')
req = urllib2.Request(self.url, headers=self.headers, )
res = urllib2.urlopen(req)
soup = BeautifulSoup(res.read(), 'html.parser')
print soup

2、出现如下错误

1
UnicodeEncodeError: 'ascii' codec can't encode characters in position 14-15: ordinal not in range(128)

3、分析原因:

看了下异常信息,是因为编码问题:Unicode编码与ASCII编码的不兼容,其实这个Python脚本文件是由utf-8编码的,而Python默认环境编码是ascii编码方式,由此Python自然调用ascii编码解码程序去处理字符流,当字符流不属于ascii范围内,就会抛出异常(ordinal not in range(128))。如果你不知道Python默认环境编码是什么,可以通过下面的方法可以获取:

1
2
3
import sys
print sys.getdefaultencoding()
# 'ascii'

4、解决方案:

通过sys.setdefaultencoding(‘utf-8)设置Python默认环境编码为utf-8,代码如下:

1
2
import sys
sys.setdefaultencoding(‘utf-8)

但是运行之后出现了如下错误:

1
AttributeError: 'module' object has no attribute 'setdefaultencoding'

意思是说sys没有setdefaultencoding()这个方法,其实是有的,只不过是先需要reload(sys)

1
2
3
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

这样就可以正常运行了
修改后的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# coding:utf-8
import urllib2
import sys
from bs4 import BeautifulSoup
import uniout
from quote import Quote
class Xianqian:
def __init__(self):
self.url = 'http://www.juzimi.com/'
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
def get_writer(self):
reload(sys)
sys.setdefaultencoding('utf-8')
quote = Quote()
req = urllib2.Request(self.url, headers=self.headers)
res = urllib2.urlopen(req)
soup = BeautifulSoup(res.read(), 'html.parser')
print soup