我在处理从不同网页(在不同的网站上)获取的文本中的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)

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

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


当前回答

这里的许多答案(例如@agf和@Andbdrew)已经解决了OP问题最直接的方面。

然而,我认为有一个微妙但重要的方面在很大程度上被忽视了,这对所有像我这样的人来说都是非常重要的,因为他们在试图理解Python中的编码:Python 2和Python 3对字符表示的管理是截然不同的。我觉得有很大一部分困惑与人们在没有版本意识的情况下阅读Python编码有关。

我建议任何有兴趣了解OP问题根源的人,首先阅读Spolsky对字符表示和Unicode的介绍,然后转到Python 2和Python 3中Unicode的Batchelder。

其他回答

这里的许多答案(例如@agf和@Andbdrew)已经解决了OP问题最直接的方面。

然而,我认为有一个微妙但重要的方面在很大程度上被忽视了,这对所有像我这样的人来说都是非常重要的,因为他们在试图理解Python中的编码:Python 2和Python 3对字符表示的管理是截然不同的。我觉得有很大一部分困惑与人们在没有版本意识的情况下阅读Python编码有关。

我建议任何有兴趣了解OP问题根源的人,首先阅读Spolsky对字符表示和Unicode的介绍,然后转到Python 2和Python 3中Unicode的Batchelder。

只需添加到变量编码('utf-8')

agent_contact.encode('utf-8')

阅读Python Unicode HOWTO。这个错误是第一个例子。

不要使用str()将unicode转换为编码文本/字节。

相反,使用.encode()对字符串进行编码:

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

或完全在unicode中工作。

这对我很有用:

export LC_CTYPE="en_US.UTF-8"

唉,这至少在Python 3中有效。。。

Python 3

有时错误在环境变量中,因此

import os
import locale
os.environ["PYTHONIOENCODING"] = "utf-8"
myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8")
... 
print(myText.encode('utf-8', errors='ignore'))

其中在编码中忽略错误。