問題
Python を使用して Web ページのスクリーン スクレイピングを行う場合、ページの文字エンコーディングを知る必要があります。文字エンコーディングが間違っていると、出力がめちゃくちゃになります。
人々は通常、いくつかの基本的な技術を使用してエンコーディングを検出します。ヘッダーの文字セットまたはメタ タグで定義された文字セットを使用するか、エンコーディング検出器(メタ タグやヘッダーを気にしない) を使用します。これらの手法を 1 つだけ使用すると、ブラウザーで行った場合と同じ結果が得られない場合があります。
ブラウザは次のようにします。
- メタ タグは常に優先されます (または xml 定義)。
- メタタグに文字セットが定義されていない場合、ヘッダーに定義されたエンコーディングが使用されます
- エンコーディングがまったく定義されていない場合は、エンコーディング検出の時間です。
(うーん...少なくとも、ほとんどのブラウザーがそうしていると私は信じています。ドキュメントは本当に不足しています。)
私が探しているのは、ブラウザが行う方法でページの文字セットを決定できるライブラリです。この問題に対する適切な解決策を必要とするのは、私が初めてではないと確信しています。
解決策(まだ試していません...)
Beautiful Soup は、ドキュメントを Unicode に変換するために、次のエンコーディングを優先順に試します。
- スープ コンストラクターに fromEncoding 引数として渡すエンコーディング。
- ドキュメント自体で検出されたエンコーディング: たとえば、XML 宣言または (HTML ドキュメントの場合) http-equiv META タグなど。Beautiful Soup がドキュメント内でこの種のエンコーディングを検出すると、ドキュメントを最初から再度解析し、新しいエンコーディングを試します。唯一の例外は、エンコーディングを明示的に指定し、そのエンコーディングが実際に機能した場合です。その場合、ドキュメント内で見つかったエンコーディングはすべて無視されます。
- ファイルの最初の数バイトを調べることによってスニッフィングされたエンコーディング。この段階でエンコーディングが検出された場合、それは UTF-* エンコーディング、EBCDIC、または ASCII のいずれかになります。
- インストールされている場合は、chardet ライブラリによってスニッフィングされたエンコーディング。
- UTF-8
- Windows-1252