2013-02-16 38 views
1

我使用python 3.3在Windows 7python3:不同的字符集的支持

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源代码中显示他们的字符集!所以,我的应用程序无法在此前进!

我应该怎么做才能自动检测字符集并根据它进行解码? 如果可能,请尽量让我深入了解并举例说明。你也可以建议重要的链接。

+0

['chardet'](http://pypi.python.org/pypi/chardet)模块试图去预测它的输入的编码,但它有时显然会错误的。 – tripleee 2013-02-16 12:22:28

+0

我已经试过'chardet',但是我没有明白如何实现!做Python有任何模块?或者在python3中不可能? – magneto 2013-02-16 12:27:36

+1

还有一个Python3端口。 Google是你的朋友。 http://getpython3.com/diveintopython3/case-study-porting-chardet-to-python-3.html – tripleee 2013-02-16 12:39:15

回答

1

BeautifulSoup提供了一个功能UnicodeDammit()通过若干步骤确定你给它的任何字符串的编码去,并将其转换为Unicode。这是非常简单的使用方法:

from bs4 import UnicodeDammit 
unicode_string = UnicodeDammit(encoded_string) 

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


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

美丽的汤尝试以下编码,按优先顺序,以 把你的文件转换成Unicode:

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

这种解释似乎并不存在于BeautifulSoup 4文档中,但据推测BS4的UnicodeDammit工作在大致相同的方式(虽然我的天堂”检查来源确定)。

+0

...后来又回到'chardet'进行任何非平凡的编码。 – tripleee 2013-02-16 18:38:56

+0

@tripleee它最终会回退到chardet,是的 - 但是(除非你指定了一个编码),它做的第一件事是磁电机正在做的事情,作为一个广泛使用的库,它可能比手卷解决方案。我编辑了我的答案,以提供有关UnicodeDammit行为的更多细节。 – 2013-02-16 18:53:31

+0

@ZeroPiraeus是的,好吧。我会尝试。但是当我在上面的代码中添加'windows-1252'时,我发现了另外一个问题,它不是解码!那么,会有什么问题?任何想法? – magneto 2013-02-17 06:59:00