python-requests,寻找正确的编码
我遇到了一个问题,就是在读取一个没有指定字符集的网页时。这个网页里有一些非ASCII字符,比如欧元符号,而我的浏览器可以正常显示这些内容。在Firefox浏览器中,我可以看到页面信息,显示使用的编码是'ISO-8859-1',而渲染模式是'Quirks mode'。不过,使用python的requests库时,它无法正确解码这些非ASCII字符,导致我在尝试把这些字符串写入文本文件时出错。举个例子:
result = requests.get(url)
result.encoding = 'ISO-8859-1'
html = result.text
open('textfile.txt', 'w').write(html)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\x80'
如果u'\x80'在'ISO-8859-1'编码中应该代表欧元符号,那应该可以正常工作。
print '\x80'.decode('ISO-8859-1')
但我得到的却是一个不可打印的字符,而不是欧元符号。
那么,为什么这个网页在浏览器中能正常显示,而requests(还有urllib/2)却处理不了这种编码呢?我也试过'utf-8',结果也是一样。有没有什么建议?
1 个回答
3
问题在于,实际的编码是 cp1252
,你可以通过下面的方式看到这一点:
print '\x80'.decode('cp1252')
这个相关的回答提供了更多细节:
PHP 函数 iconv 从 iso-8859-1 转换到 utf-8 的字符编码
虽然这和 Python 没关系,但问题是一样的,并且解释了为什么会出现这种情况。