python - Python 3.3 是否比 2.7 更好地解码和重新编码已抓取的 Web 文本为 UTF-8?比如,好多了?

标签 python python-2.7 python-3.x unicode encoding

似乎有一百万个问题涉及 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)。这太烦人了。

我读过(herehere),在 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 解决您的问题的建议是这样的:

  1. 当然要阅读 Joel 的文章(很棒的阅读,只需 30 分钟或更短时间)
  2. 找出网页使用的编码(您可以通过查看响应 header BeautifulSoup中的字段来感知这一点.
  3. .decode() 使用您计算出的编码检索到的字符串
  4. 当您解码时,您不再有str 对象,您有一个unicode 对象。
  5. unicode 只是一种内部表示,不是真正的编码,所以如果你想将内容输出到某个地方,你将不得不 .encode() 它并且我建议你当然使用utf-8

现在,必须了解一些要点。也许您正在抓取的网页不是编码感知,并且它说它使用了一些编码但没有坚持下去。这是网站管理员的错误,但您必须采取一些措施来解决这个问题。您有 3 个选择:

  1. ,ignore 可能有问题的字符。静静地让他们过去。
  2. 有一些很好的 python 库可以尝试找出字符串使用的编码方式。这些非常准确,但当然不是 Elixir 。他们可能无法猜测,特别是当 encoding 格式错误时
  3. 一生气就放弃这个项目;)(我真的不推荐这个)

要获得正确的编码,源代码和客户端需要一定程度的纪律。您必须正确开发您的程序,但您需要有关编码的信息与源代码中的实际编码相匹配。

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/

相关文章:

python - Xaxis 标签与数据点不匹配 - Pandas/Matplotlib

python - 使用 Python 和 Keras 调整 CSV 数据的大小

python - 如何使用 conn.send() 向客户端发送数据

django - 将用户作为参数传递

python - Django读取pdf文件内容

python - 挑选数据库后进行身份验证

python - Django 中的 2 个表单,1 个 View ,2 个 SQL 表

python - 如何根据pydatatable中的数据类型选择列?

python - gevent和多进程的区别

python - 我写了两个单独的文件,一个包含类,另一个调用它们,但调用一个是所有对象。为什么?