Python:将Unicode转换为ASCII,无错误

问题:

我的代码只是抓住一个网页,然后将其转换为Unicode。

html = urllib.urlopen(link).read()
html.encode("utf8","ignore")
self.response.out.write(html)

但是我得到一个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尝试在某处。我可以放弃任何代码字节导致问题,而不是得到错误?

回答:

我们可以获得用于link的实际值
另外,当我们尝试.encode()已经编码的字节串时,我们通常会遇到这个问题。所以你可以先尝试解码它,如同

html = urllib.urlopen(link).read()
unicode_str = html.decode(<source encoding>)
encoded_str = unicode_str.encode("utf8")

举个例子:

html = '\xa0'
encoded_str = html.encode("utf8")

失败了

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128)

而:

html = '\xa0'
decoded_str = html.decode("windows-1252")
encoded_str = decoded_str.encode("utf8")

成功无误。请注意,“windows-1252”是我用作example的东西。我从chardet得到这个,它有0.5的信心是正确的! (嗯,如1个字符长度的字符串给出的,你期望什么)你应该将它改为从.urlopen().read()返回的字节串的编码到适用于你检索到的内容。
我看到的另一个问题是,.encode()字符串方法返回修改后的字符串,不会修改源。所以self.response.out.write(html)因为html不是来自html.encode的编码字符串(如果这是你最初的目的),那么这样做是没有用的。
按照Ignacio建议,检查源网页是否从read()返回的字符串的实际编码。它是在元标记之一或响应中的ContentType标题中。然后使用它作为.decode()的参数
但请注意,不应该假定其他开发人员有足够的责任确保标题和/或元字符集声明与实际内容匹配。 (这是一个PITA,是的,我应该知道,我was之前的一个)。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Python: Convert Unicode to ASCII without errors

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

67 + = 70