编码和urllib有问题

时间:2010-05-14 14:05:57

标签: python encoding urllib

我正在使用urllib加载网页。这是俄语符号,但页面编码是'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)

2 个答案:

答案 0 :(得分:2)

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

使用unicode(requestHandler.read(), 'utf-8') requestHandler.read().decode('utf-8'):其中任何一个都应生成正确的unicode对象如果编码确实是{{1} (utf-8字节的存在表明它可能不存在,但是从上下文中显示单个非ascii字符是不可能的。)

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

sys.stdout.encoding

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

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

打印utf8编码的字节串:

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

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

答案 1 :(得分:1)

如果requestHandler.read()提供UTF-8编码的流,那么

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

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

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