问题来源:需要对爬取到的如下文本进行分隔,且以“:”(中文冒号)进行分隔。
对应文本分隔代码:
IrmComTemp = IrmCom.strip().split(unicode(':','utf-8'))
问题1描述:出现如下错误:SyntaxError: Non-ASCII character '\xef' in file
问题1解决:在源码第一行(必须保证是第一行)添加如下字符编码限定语句:
# -*- coding: UTF-8 -*-
问题1原因:python2会默认使用ASCII编码,而ASCII编码不支持中文,所以会出现异常(具体回顾之前关于编码的文章)。如果要在python2的py文件里面写中文,则必须要添加这一行声明文件编码的注释。
问题2描述:添加之后又出现UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0:错误
问题2解决:
#错误代码 IrmComTemp = IrmCom.strip().split(':','utf-8')
#正确代码 IrmComTemp = IrmCom.strip().split(unicode(':','utf-8'))
问题2原因:(参考'ascii' codec can't decode byte 0xef in position 0:ordinal not in range(128)错误解决与原理分析)utf-8只是Unicode字码表的编码方式,Unicode除此之外还可以使用utf-16等编码成byte code储存,在Python中我们已经指定了utf-8编码方式,那么所有带中文的字符串都会被认为是utf-8编码的byte string(例如:':'),但是在函数中所产生的字符串则被认为是unicode string。unicode string 和 byte string 是不可以混合使用的,一旦混合使用了,就会产生这样的错误。
本文中,函数返回的爬取下来的网页被认为是Unicode string,':'被认为是byte string,由于预设的解石马器(醉了,提交的时候说这里敏感。。。。)是ascii,所以就不能识别中文byte string。然后就报错了。
参考的博文中作者提供了两种解决方案:1》unicode string转byte string;2》byte string 转unicode string。总之就是统一编码。
由于对爬取下来的网页进行转换比较麻烦,所以我们这里使用byte转unicode的方案,另一种方案尚待尝试。