我的代码只是刮取一个网页,然后将其转换为Unicode。
Unicode
html = urllib.urlopen(link).read() html.encode("utf8","ignore") self.response.out.write(html)
但是我得到了UnicodeDecodeError:
UnicodeDecodeError
Traceback (most recent call last): File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 507, in __call__ handler.get(*groups) File "/Users/greg/clounce/main.py", line 55, in get html.encode("utf8","ignore") UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 2818: ordinal not in range(128)
我认为这意味着HTML在某处包含一些错误的Unicode尝试。我能丢掉导致问题的任何代码字节而不出错吗?
使用类似的压缩gzip已变得非常流行(约73%的网站都在使用它,包括Google,YouTube,Yahoo,Wikipedia,Reddit,Stack Overflow和Stack Exchange Network网站等大型网站)。 如果你像原始答案中那样使用gzip压缩响应进行简单解码,则会收到类似以下错误:
gzip
Google,YouTube,Yahoo,Wikipedia,Reddit,Stack Overflow
Stack Exchange Network
UnicodeDecodeError:'utf8'编解码器无法解码位置1的字节0x8b
UnicodeDecodeError:'utf8'
为了解码gzpipped响应,你需要添加以下模块(在Python 3中):
import gzip import io
然后,你可以像这样解析内容:
response = urlopen("https://example.com/gzipped-ressource") buffer = io.BytesIO(response.read()) # Use StringIO.StringIO(response.read()) in Python 2 gzipped_file = gzip.GzipFile(fileobj=buffer) decoded = gzipped_file.read() content = decoded.decode("utf-8") # Replace utf-8 with the source encoding of your requested resource
此代码读取响应,并将字节放入缓冲区。然后,gzip模块使用GZipFile函数读取缓冲区。之后,可以将压缩后的文件再次读取为字节,最后将其解码为通常可读的文本。