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

今天爬取某小说网站小说的内容导出到文本文档(*.txt)中

但是在保存的时候(保存代码如下)

with open("douluo.txt",'a') as f:
   f.write(text)


报以下错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-78: ordinal not in range(128)

本来以为数据读取错误,我特将fp.write改成print,结果数据全部读取并显示在命令控制台上了,证明代码是没有问题的,仔细看了下异常信息,貌似是因为编码问题:Unicode编码与ASCII编码的不兼容,其实这个Python脚本文件是由utf-8编码的,同时SQlite3数据库存取的也是UTF-8格式,Python默认环境编码通过下面的方法可以获取:

import sys
print sys.getdefaultencoding()
# 'ascii'

基本上是ascii编码方式,由此Python自然调用ascii编码解码程序去处理字符流,当字符流不属于ascii范围内,就会抛出异常(ordinal not in range(128))。

解决的方案很简单,修改默认的编码模式,很多朋友会想到setdefaultencoding,是的,我们可以通过sys.setdefaultencoding(‘utf-8’)来将当前的字符处理模式修改为utf-8编码模式,值得注意的是,如果单纯这么调用的话,Python会抛出一个AttributeError异常:

Traceback (most recent call last):
  File "", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'

竟然说sys没有setdefaultencoding的方法,其实sys是有这个方法的,但是要请出她老人家需要调用一次reload(sys),很奇怪,是么?如果有谁知道原因的话,还望不吝赐教。

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

好了,通过上面短短的三行,我们算是很好的解决了这个问题了,同样的方式也可以应用到UnicodeDecodeError上。当然这个技巧来自于网络,我还找到其他特别的办法,但是感觉还是这个比较靠谱.


完整代码如下

import urllib2
from lxml import etree
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def get_text(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
    }
    request = urllib2.Request(url, headers=headers)
    html = urllib2.urlopen(request).read()
    content = etree.HTML(html)
    #filename = content.xpath('//div[@class="bookInfo"]/h1/strong/text()')
    texts = content.xpath('//div[@class="bookInfo"]/div/text()')
    for text in texts:

        with open("douluo.txt",'a') as f:
           f.write(text)


你可能感兴趣的:(解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误)