【问题标题】:urllib2 opener providing wrong charseturllib2 开启程序提供错误的字符集
【发布时间】:2012-02-25 16:07:38
【问题描述】:

当我打开网址并阅读它时,我无法识别它。但是当我检查内容标头时,它说它被编码为 utf-8。所以我尝试将它转换为 unicode,它抱怨 UnicodeDecodeError: 'ascii' codec can't decode byte 0x8b in position 1: ordinal not in range(128) using unicode()。

.encode("utf-8") 产生 UnicodeDecodeError:“ascii”编解码器无法解码位置 1 中的字节 0x8b:序数不在范围内 (128)

.decode("utf-8") 产生 UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1: invalid start byte.

我已经尝试了所有我能想到的(我不擅长编码)

如果我能让它工作,我会很高兴。谢谢。

【问题讨论】:

  • HTTP 标头可能是错误的 - 在 HTML 本身中查找指定 HTML 的元标记。可能是 Latin-1 (.decode('latin-1'))。
  • 试过了。而且我很确定它是 utf-8,因为 chrome sais 所以当我访问该网站时。
  • 如果你的流真的是 utf8 编码的,.decode("utf-8") 可以工作。所以,你一定是误会了什么。您可以发布给您带来麻烦的网址(或:网址)吗?
  • 您能否创建一个minimal complete example 来显示问题,例如print-page-info.py

标签: python utf-8 character-encoding urllib2


【解决方案1】:

这是一个常见的错误。服务器发送 gzipped 流。

你应该先打开它:

response = opener.open(self.__url, data)
if response.info().get('Content-Encoding') == 'gzip':
    buf = StringIO.StringIO( response.read())
    gzip_f = gzip.GzipFile(fileobj=buf)
    content = gzip_f.read()
else:
    content = response.read()

【讨论】:

  • 我想通了。但我会接受这个作为答案,这样其他人就不会犯我的错误:)
【解决方案2】:

标题可能是错误的。查看chardet

编辑:多想一想——我的钱花在被 gzip 压缩的内容上。我相信 Python 的各种 URL 打开模块/类/等中的一些会解压缩,而另一些则不会。

【讨论】:

  • 没有找到任何编码:(
  • 假设浏览器正确呈现它,它可能会告诉你编码。数据是否有可能被 gzip 压缩?我以前也打过。
  • 我不这么认为。我可以试试解压。
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多