似乎有一百万个问题涉及 Python Unicode 错误,其中 ...ordinal [is] not in range(128)
。看起来,绝大多数都涉及 Python 2.x。
我知道这些错误,因为我目前正处于编码、解码的 hell 中。对于一个副项目,我抓取网页并尝试规范化该文本数据,这样它就不会出现在我们的网站上,带有疯狂的字符。为了规范化数据,我依靠 HTMLParser 的 HTMLParser()
和 entitydefs
,以及从文本的原始形式(string.decode(' [原始编码]', 'ignore'))
并将其编码为 UTF-8 (string.encode('utf-8', 'ignore')
)。
然而,似乎总有一个网站我的最大努力失败了,引发了同样的旧UnicodeError:ASCII解码错误...序号不在范围内(128)。
这太烦人了。
我读过(here 和 here),在 Python 3 中所有文本都是 Unicode。虽然我已经阅读了很多关于 Unicode 的文章,但因为我不是软件工程师,所以我不知道 Unicode 是否在客观上比 2.x 的默认 ascii 编码选项更好(即故障率更低)。我不得不认为任何事情都会更好,但我希望更专业和更有经验的人能提供一些观点。
我想知道我是否应该迁移到 Python 3,因为它(改进了)对从网络上抓取的文本的处理。我希望这里有人可以解释(或建议解释的资源)Python 3 文本处理方法的优缺点。这个会比较好吗??有没有人处理过我已经迁移到 Python 3 的同样问题?如果 2to3
迁移不是问题,他/她会建议我开始使用 Python 3 吗??
提前感谢您的帮助。我当然需要它。
最佳答案
我将从 Python 2.7 用户的角度来谈。
确实,Python 3 在 Unicode
字段上引入了一些重大变化。我不会说在 Python 3 中使用 encodings
更容易,但它确实更适合做 i18n 的事情。
正如我所说,我使用 Python 2.7,到目前为止,我已经能够处理我发现的每个 encoding
问题。您只需要了解幕后发生的事情,并且对 encodings
的含义有一个非常合理的背景,当然:this is the best article there is to understand encodings .
在那篇文章中,Joel 说了一些您需要记住的事情每当您遇到编码
情况时:
It does not make sense to have a string without knowing what encoding it uses.
话虽如此,我对使用 Python 2.7 解决您的问题的建议是这样的:
- 当然要阅读 Joel 的文章(很棒的阅读,只需 30 分钟或更短时间)
- 找出网页使用的
编码
(您可以通过查看响应 header
或BeautifulSoup
中的字段来感知这一点. .decode()
使用您计算出的编码
检索到的字符串- 当您
解码
时,您不再有str
对象,您有一个unicode
对象。 unicode
只是一种内部表示,不是真正的编码,所以如果你想将内容输出到某个地方,你将不得不.encode()
它并且我建议你当然使用utf-8
。
现在,必须了解一些要点。也许您正在抓取的网页不是编码感知,并且它说它使用了一些编码
但没有坚持下去。这是网站管理员的错误,但您必须采取一些措施来解决这个问题。您有 3 个选择:
,ignore
可能有问题的字符。静静地让他们过去。- 有一些很好的 python 库可以尝试找出字符串使用的编码方式。这些非常准确,但当然不是 Elixir 。他们可能无法猜测,特别是当
encoding
格式错误时 - 一生气就放弃这个项目;)(我真的不推荐这个)
要获得正确的编码
,源代码和客户端需要一定程度的纪律。您必须正确开发您的程序,但您需要有关编码的信息与源代码中的实际编码相匹配。
Python 3 改进了它的 unicode
处理,但是如果您不明白发生了什么,它可能毫无用处。你能做的最好的事情就是理解 encodings
(不是那么难,再一次,阅读 Joel!),一旦你理解了它,你就能够使用 Python 2.7、Python 3.3 和甚至 PHP ;)
希望这对您有所帮助!
关于python - Python 3.3 是否比 2.7 更好地解码和重新编码已抓取的 Web 文本为 UTF-8?比如,好多了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20555142/