【问题标题】:python3: different charset supportpython3:不同的字符集支持
【发布时间】:2017-03-21 08:05:56
【问题描述】:

我在 Windows 7 中使用 python 3.3。

if "iso-8859-1" in str(source):
    source = source.decode('iso-8859-1')
if "utf-8" in str(source):
    source = source.decode('utf-8')

所以,目前我的申请仅对上述两个字符集有效......但我想涵盖所有可能的字符集。

实际上,我是从网站的源头手动查找这些字符集的,并且我体验到世界上所有的网站都不仅仅来自这两个。有时网站不会在其 HTML 源代码中显示其字符集!所以,我的应用程序无法继续前进!

我应该怎么做才能自动检测字符集并根据它进行解码? 如果可能,请尝试让我深入了解并提供示例。您也可以推荐重要的链接。

【问题讨论】:

  • chardet 模块试图预测其输入的编码,但有时它显然会出错。
  • 我已经尝试查看chardet,但我没有了解如何实施! python有什么模块吗?还是在 python3 中是不可能的?
  • 还有一个 Python3 端口。谷歌是你的朋友。 getpython3.com/diveintopython3/…
  • 好的...我会尝试的。但是我们还有其他选择来解决这个问题吗?

标签: python html python-3.x character-encoding python-3.3


【解决方案1】:

BeautifulSoup 提供了一个函数UnicodeDammit(),它通过多个步骤1 来确定你给它的任何字符串的编码,并将其转换为 unicode。使用起来非常简单:

from bs4 import UnicodeDammit
unicode_string = UnicodeDammit(encoded_string)

如果您使用 BeautifulSoup 处理您的 HTML,它会 automatically use UnicodeDammit 为您将其转换为 unicode。


1According to the documentation for BeautifulSoup 3,这些是 UnicodeDammit 采取的行动:

Beautiful Soup 按优先级顺序尝试以下编码,以 将您的文档转换为 Unicode:

  • 作为 fromEncoding 参数传递给汤构造函数的编码。
  • 在文档本身中发现的编码:例如,在 XML 声明或(对于 HTML 文档)一个 http-equiv META 标记。如果美丽 Soup 在文档中找到这种编码,它会解析 从头开始重新记录并尝试新的编码。这 唯一的例外是您明确指定了编码,并且 encoding 实际上有效:那么它将忽略它在 文件。
  • 通过查看文件的前几个字节来嗅探的编码。如果 在此阶段检测到编码,它将是 UTF-* 编码之一, EBCDIC 或 ASCII。
  • chardet 库嗅探到的编码(如果已安装)。
  • UTF-8
  • Windows-1252

BeautifulSoup 4 文档中似乎没有这种解释,但大概 BS4 的 UnicodeDammit 以大致相同的方式工作(尽管我没有检查来源以确定)。

【讨论】:

  • ... 对于任何重要的编码,这反过来又回退到chardet
  • @tripleee 它最终确实会回到 chardet,是的 - 但是(除非你指定编码)它做的第一件事是磁力发电机试图做的事情,作为一个广泛使用的库,它是可能比手动解决方案更强大。我已经编辑了我的答案,以提供有关 UnicodeDammit 行为的更多细节。
  • @ZeroPiraeus 是的,好的。我会试试。但是当我在上面的代码中添加windows-1252 时,我又发现了一个问题,它不是解码!那么,会有什么问题呢?有什么想法吗?
  • @magneto 可能有多种原因。举一个例子,你现在正在阅读的页面的源代码没有字符集声明(你真丢脸,stackoverflow),但确实包含字符串"iso-8859-1"、@987654330 @ 和现在 "windows-1252",因此您问题中的代码很可能无法正确解码。与尝试推出自己的解决方案相比,您确实最好使用现成的解决方案。
猜你喜欢
  • 2018-08-22
  • 1970-01-01
  • 2012-04-13
  • 2016-06-09
  • 2020-08-25
  • 2018-07-25
  • 2016-08-14
  • 2015-01-11
  • 2017-05-25
相关资源
最近更新 更多