python ‘gbk’ codec can’t encode错误

写爬虫的时候,对网页都进行了decode('utf-8'),把编码转换成unicode进行处理

html = getHtml(url).decode('utf-8','ignore')

但是在爬取过程中,遇到类似这样的信息时

'DepartmentofDiagnosticandInterventionalRadiology,UniversityHospitalZurich,R
\ue242mistrasse100,8091Zürich,Switzerland;'

可以注意到中间有R\ue242这样数据
这些数据用print可以正常打印出来
但是写入csv文件的时候就会产生错误

spamwriter.writerow(data)

UnicodeEncodeError: ‘gbk’ codec can’t encode character '\ue242' in position 159: illegal multiby 

不太明白为什么会出错,之前对网页信息都进行了decode,处理的应该都是unicode才对。这样的话,无论后面如何处理,\ue242应该已经被编码成了unicode,为什么不可以encode成gbk存储起来?
系统是win 8x64,默认编码是gbk,之前的print操作不也是encode成gbk再打印的吗?
要怎么处理?

阅读 12.1k
1 个回答

不同编码集能表示的符号是不同的,而且这些符号解码后对应的值也不同。
在将一个二进制数据编码成文本时,如果有一个符号无法编码,很有可能是因为选择的编码方式不正确。
对于这种情况下,比起不声不响地跳过这部分内容,python的默认方式是选择了使用异常进行提示。
个人觉得,这种方式可以避免一些逻辑错误,因此是一种比较明智的方式。

对于这一问题的处理:
选择正确的编码方式当然是正确的解决方案。

按题主的意思,就是要用gbk编码,那么根据encode函数的说明:
encode(...)

S.encode(encoding='utf-8', errors='strict') -> bytes

encode()函数有两个参数,第二个参数errors用来设置在编码错误的时候如何解码。
使用backslashreplace就行了。

>>> a = '\ue242'
>>> a
'\ue242'
>>> a.encode(encoding='gbk')
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a.encode(encoding='gbk')
UnicodeEncodeError: 'gbk' codec can't encode character '\ue242' in position 0: illegal multibyte sequence
>>> a.encode(encoding='gbk', errors='backslashreplace')
b'\\ue242'
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进