我正在使用urllib加载网页。这是俄语符号,但页面编码是'utf-8'
pageData = unicode(requestHandler.read()).decode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 262: ordinal not in range(128)
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)
答案 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编码的。