UnicodeEncodeError:“ascii”编解码器无法对位置20中的字符u“\xa0”进行编码:序号不在范围(128)内

2024-04-19 21:11:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

问题是,错误并不总是可复制的;它有时可用于某些页面,有时通过抛出一个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)

我怀疑这是因为一些页面(或者更具体地说,来自某些站点的页面)可能被编码,而其他页面可能未编码。所有网站都以英国为基地,提供英国消费的数据,因此除了英语之外,没有任何与内化或处理文本相关的问题。

有没有人知道如何解决这个问题,以便我能始终如一地解决这个问题?


Tags: in文本info网页编码站点错误unicode
3条回答

您需要阅读PythonUnicode HOWTO。这个错误是very first example

基本上,停止使用str将unicode转换为编码文本/字节。

相反,请正确使用^{}对字符串进行编码:

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

或者完全使用unicode。

这是典型的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à

喂\u00E0!

问题是,当您调用str()时,python使用默认的字符编码来尝试对您给它的字节进行编码,在您的例子中,这些字节有时是unicode字符的表示。要解决这个问题,您必须告诉python如何使用.encode('whatever_unicode')处理您给它的字符串。大多数时候,使用utf-8应该没问题。

关于这个主题的一个很好的解释,请参见Ned Batchelder的PyCon谈话:http://nedbatchelder.com/text/unipain.html

我找到了一个很好的方法来移除符号并继续将字符串保持为字符串,如下所示:

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

需要注意的是,使用ignore选项是很危险的,因为它会从使用它的代码中无声地删除任何unicode(和国际化)支持,如下所示(convert unicode):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'

相关问题 更多 >