我在处理从不同网页(在不同的网站上)获取的文本中的unicode字符时遇到了问题。我用的是BeautifulSoup。

问题是,误差并不总是可再现的;它有时会处理某些页面,有时会通过抛出UnicodeEncodeError而退出。我几乎尝试了我能想到的所有方法,但我没有找到任何能在不引发某种Unicode相关错误的情况下始终工作的方法。

导致问题的代码部分如下所示:

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

下面是运行上面的代码段时在某些字符串上生成的堆栈跟踪:

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

我怀疑这是因为某些页面(或者更具体地说,来自某些网站的页面)可能是编码的,而其他页面可能是未编码的。所有的网站都设在英国,并提供英国消费的数据,因此不存在与内化或处理非英语文本相关的问题。

有没有人对如何解决这个问题有什么想法,以便我能够始终如一地解决这个问题?


当前回答

我刚刚遇到了这个问题,谷歌把我带到了这里,所以为了补充这里的一般解决方案,这是对我有用的:

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

我看了奈德的演讲后有了这个想法。

不过,我并没有完全理解为什么这样做有效。所以,如果有人能编辑这个答案或发表评论来解释,我将不胜感激。

其他回答

这将起作用:

 >>>print(unicodedata.normalize('NFD', re.sub("[\(\[].*?[\)\]]", "", "bats\xc3\xa0")).encode('ascii', 'ignore'))

输出:

>>>bats

在运行脚本之前,可以将字符编码设置为UTF-8:

export LC_CTYPE="en_US.UTF-8"

这通常可以解决问题。

在脚本开头添加以下行(或作为第二行):

# -*- coding: utf-8 -*-

这就是python源代码编码的定义。更多信息请参见PEP 263。

更新python 3.0及更高版本。在python编辑器中尝试以下操作:

locale-gen en_US.UTF-8
export LANG=en_US.UTF-8 LANGUAGE=en_US.en
LC_ALL=en_US.UTF-8

这将系统的默认区域设置编码设置为UTF-8格式。

更多信息可以在PEP538中阅读——强制传统的C语言环境转换为基于UTF-8的语言环境。

延迟回答,但此错误与您的终端编码不支持某些字符有关。我用以下方法在python3上修复了它:

import sys
import io

sys.stdout = io.open(sys.stdout.fileno(), 'w', encoding='utf8')
print("é, à, ...")