Python 3.3比解码和重新编码Scraped Web文本到UTF-8更好吗?比如,好多了?

Bee*_*ars 7 python unicode encoding python-2.7 python-3.x

似乎有一百万个涉及Python Unicode错误的问题...ordinal [is] not in range(128).看似绝大多数都涉及Python 2.x.

我知道这些错误,因为我目前正在编码,解码地狱.对于侧面项目,我抓取网页并尝试规范化该文本数据,以便它不会出现在我们的网站上有疯狂的字符.数据标准化的,我靠的HTMLParser的HTMLParser()entitydefs,以及解码从无论其原始形式是文字(string.decode('[original encoding]', 'ignore'))并将其编码为UTF-8( string.encode('utf-8', 'ignore')).

然而,看起来总是有一个网站,我的最大努力失败了,提高了同样的老,UnicodeError: ASCII decoding error...ordinal not in range(128). 这太烦人了.

我读过(这里这里)在Python 3中所有文本都是Unicode.虽然我已经阅读了很多关于Unicode的内容,但由于我不是软件工程师,我不知道Unicode是否比2.x的默认ascii编码选项客观上更好(即,更低的失败率).我必须认为一切都会好一些,但我想如果有更专业和经验的人可以提供一些观点.

我想知道我是否应该迁移到Python 3来处理从Web上删除的文本(改进).我希望这里有人可以解释(或建议解释资源)Python 3文本处理方法的优缺点.好点吗??是否有人处理了我已经迁移到Python 3的同一问题?如果2to3迁移不是问题,他/她会建议我开始使用Python 3 吗?

提前感谢您的任何帮助.我当然需要它.

Pau*_* Bu 10

我将从Python 2.7用户的角度讲.

确实,Python 3在该Unicode领域引入了一些重大变化.我不会说encodings在Python 3中使用它更容易,但它确实更适合做i18n的东西.

就像我说的,我使用Python 2.7,到目前为止我已经能够处理encoding我发现的每个问题.你只需要了解幕后发生的事情,并且有一个非常合理的背景encodings知识,当然:这是了解编码的最佳文章.

在那篇文章中,Joel说出了每次遇到自己时都encoding需要记住事情:

在不知道它使用什么编码的情况下拥有字符串是没有意义的.

话虽如此,我建议用Python 2.7解决你的问题是这样的:

  1. 阅读乔尔的文章(精彩的阅读,只需30分钟或更短)
  2. 找出encoding网页正在使用的内容(你可以通过查看Response headers或在一个字段中看到它BeautifulSoup.
  3. .decode()使用encoding你想出的检索到的字符串
  4. 当你decode,你没有str对象时,你有一个unicode对象.
  5. unicode只是一个内部表示,而不是一个真正的编码,所以如果你想在某个地方输出内容,你将不得不这样.encode()做,我建议你utf-8当然使用它.

现在,必须了解一些要点.也许您正在抓取的网页不是编码识别的,它说它使用了一些encoding但不坚持它.这是网站管理员所犯的错误,但你必须做点什么才能搞清楚.你有3个选择:

  1. ,ignore可能有问题的字符.只是悄悄地通过他们.
  2. 有很好的python库试图找出字符串正在使用的编码.这些都非常准确但当然不是银弹.他们无法猜测,特别encoding是在畸形时
  3. 生气并放弃项目;)(我真的不推荐这个)

为了做到encodings正确,需要从来源和客户那里获得一些纪律.您必须正确开发您的程序,但您需要有关编码的信息和源处的实际编码匹配.

Python 3改进了它的unicode处理,但如果你不明白发生了什么,它可能会没用.你能做的最好的事情就是理解encodings(并不难,再次阅读Joel!),一旦你理解了它,你就能用Python 2.7,Python 3.3甚至PHP来处理它;)

希望这可以帮助!

  • 非常好的作品,充满了健康的事实,没有那些讨厌的意见!;) (2认同)