我在处理从不同网页(在不同的网站上)获取的文本中的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)
我怀疑这是因为某些页面(或者更具体地说,来自某些网站的页面)可能是编码的,而其他页面可能是未编码的。所有的网站都设在英国,并提供英国消费的数据,因此不存在与内化或处理非英语文本相关的问题。
有没有人对如何解决这个问题有什么想法,以便我能够始终如一地解决这个问题?
问题是您试图打印unicode字符,但您的终端不支持它。
您可以尝试安装语言包en-package来解决此问题:
sudo apt-get install language-pack-en
它为所有支持的包(包括Python)提供英语翻译数据更新。如果需要,安装不同的语言包(取决于您要打印的字符)。
在某些Linux发行版上,为了确保正确设置默认的英语区域设置(因此,可以通过shell/终端处理unicode字符),需要使用此选项。有时安装它比手动配置它更容易。
然后在编写代码时,确保在代码中使用正确的编码。
例如:
open(foo, encoding='utf-8')
如果仍有问题,请仔细检查系统配置,例如:
您的区域设置文件(/etc/default/locate),该文件应具有例如。LANG=“en_US.UTF-8”LC_ALL=“en_US.UTF-8”或:LC_ALL=C.UTF-8LANG=C.UTF-8外壳中LANG/LC_CTYPE的值。通过以下方式检查shell支持的语言环境:区域设置-a |grep“UTF-8”
演示新VM中的问题和解决方案。
初始化并设置VM(例如使用流浪者):流浪者init ubuntu/trusty64;流浪;流浪ssh请参阅:可用的Ubuntu盒子。。打印unicode字符(如商标符号™): $python-c'打印(u“\u2122”);'回溯(最近一次调用):文件“<string>”,第1行,在<module>中UnicodeEncodeError:“ascii”编解码器无法对位置0中的字符u“\u2122”进行编码:序号不在范围内(128)现在安装语言包en:$sudo apt-get-y安装语言包en将安装以下额外软件包:基本语言包正在生成区域设置。。。en_GB.UTF-8…/usr/sbin/locale gen:done生成完成。现在应该解决问题:$python-c'打印(u“\u2122”);'™否则,请尝试以下命令:$LC_ALL=C.UTF-8 python-C'打印(u“\u2122”);'™
这是一个经典的python unicode痛点!考虑以下事项:
a = u'bats\u00E0'
print a
=> batsà
到目前为止一切都很好,但如果我们调用str(a),让我们看看会发生什么:
str(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
噢,滴,这对任何人都没有好处!要修复该错误,请使用.encode显式编码字节,并告诉python要使用的编解码器:
a.encode('utf-8')
=> 'bats\xc3\xa0'
print a.encode('utf-8')
=> batsà
Voil\u00E0!
问题是,当您调用str()时,python使用默认的字符编码来尝试对您给它的字节进行编码,在您的情况下,这些字节有时是unicode字符的表示。要解决这个问题,你必须告诉python如何使用.encode('hatever_unicode')处理你给它的字符串。大多数时候,你应该可以使用utf-8。
有关此主题的精彩阐述,请参阅Ned Batchelder的PyCon演讲:http://nedbatchelder.com/text/unipain.html