1

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')

したがって、現在、私のアプリケーションは上記の 2 つの文字セットに対してのみ有効です...しかし、考えられるすべての文字セットをカバーしたいと考えています。

実際、私はこれらの文字セットを Web サイトのソースから手動で見つけています。世界中のすべての Web サイトがこれら 2 つだけではないことを経験しました。Web サイトの HTML ソースに文字セットが表示されないことがあります。したがって、私のアプリケーションはそこに進むことができません!

文字セットを自動的に検出し、それに従ってデコードするにはどうすればよいですか? 可能であれば、例を挙げて詳しく教えてください。重要なリンクも提案できます。

4

1 に答える 1

1

BeautifulSoupUnicodeDammit()は、いくつかのステップ1を実行して、指定した文字列のエンコードを判別し、それをUnicodeに変換する関数を提供します。使用するのは非常に簡単です。

from bs4 import UnicodeDammit
unicode_string = UnicodeDammit(encoded_string)

BeautifulSoupを使用してHTMLを処理する場合、UnicodeDammitを自動的に使用してHTMLをユニコードに変換します。


1 BeautifulSoup 3のドキュメントによると、 UnicodeDammitが実行するアクションは次のとおりです。

Beautiful Soupは、ドキュメントをUnicodeに変換するために、優先度の高い順に次のエンコードを試みます。

  • fromEncoding引数としてsoupコンストラクターに渡すエンコーディング。
  • ドキュメント自体で検出されたエンコーディング:たとえば、XML宣言または(HTMLドキュメントの場合)http-equivMETAタグ。Beautiful Soupは、ドキュメント内でこの種のエンコーディングを検出すると、ドキュメントを最初から再度解析し、新しいエンコーディングを試してみます。唯一の例外は、エンコーディングを明示的に指定し、そのエンコーディングが実際に機能した場合です。その場合、ドキュメント内で見つかったエンコーディングはすべて無視されます。
  • ファイルの最初の数バイトを調べてスニッフィングされたエンコーディング。この段階でエンコーディングが検出された場合、それはUTF- *エンコーディング、EBCDIC、またはASCIIのいずれかになります。
  • シャルデットライブラリがインストールされている場合は、それによってスニッフィングされたエンコーディング。
  • UTF-8
  • Windows-1252

その説明はBeautifulSoup4のドキュメントには記載されていないようですが、おそらくBS4のUnicodeDammitはほとんど同じように機能します(ソースを確認していませんが)。

于 2013-02-16T16:13:52.673 に答える