python3:不同的charset支持

时间:2013-02-16 12:09:58

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

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

如何自动检测字符集并根据它进行解码? 如果可能的话,请尽量让我深入了解并提供示例。您也可以建议重要的链接。

1 个答案:

答案 0 :(得分:1)

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

from bs4 import UnicodeDammit
unicode_string = UnicodeDammit(encoded_string)

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


1 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以相同的方式工作(虽然我没有检查源代码以确定)。