1

我正在使用 urllib 加载网页。有 eis 俄罗斯符号,但页面编码是 'utf-8'

1

pageData = unicode(requestHandler.read()).decode('utf-8')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 262: ordinal not in range(128)

2

pageData = requestHandler.read()
soupHandler = BeautifulSoup(pageData)
print soupHandler.findAll(...)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 340-345: ordinal not in range(128)
4

2 回答 2

2

在您的第一个代码段中,调用unicode(requestHandler.read())告诉 Python 将返回的字节串转换readunicode: 因为没有为转换指定代码,所以ascii会尝试(并失败)。它永远不会到达您要调用的地步.decode(无论如何调用该 unicode 对象是没有意义的)。

使用unicode(requestHandler.read(), 'utf-8'),或: 如果编码确实requestHandler.read().decode('utf-8')是,则这些中的任何一个都应该产生正确的 unicode 对象(该字节的存在表明它可能不是,但不可能从上下文中显示单个非 ascii 字符来猜测)。utf-8D0

print处理 Unicode 数据是一个不同的问题,需要一个配置良好且协作的终端仿真器——一个允许 Pythonsys.stdout.encoding在启动时设置的终端仿真器。例如,在 Mac 上,使用 Apple 的 Terminal.App:

>>> sys.stdout.encoding
'UTF-8'

所以 Unicode 对象的打印在这里可以正常工作:

>>> print u'\xabutf8\xbb'
«utf8»

和 utf8 编码的字节字符串的打印一样:

>>> print u'\xabutf8\xbb'.encode('utf8')
«utf8»

但在其他机器上,只有后者可以工作(使用终端仿真器自己的编码,您需要自己发现它,因为终端仿真器没有告诉 Python;-)。

于 2010-05-14T14:17:28.427 回答
1

如果requestHandler.read()传递一个 UTF-8 编码的流,那么

pageData = requestHandler.read().decode('utf-8')

会将其解码为 Unicode 字符串(此时,正如 Dietrich Epp 正确指出的那样),unicode()不再需要调用。

如果它抛出异常,那么输入显然不是 UTF-8 编码的。

于 2010-05-14T14:09:23.110 回答