この記事では、Python クロールで文字化けした Web ページが発生する原因と解決策を紹介します。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。
Python2 を使用して Web ページをクロールすると、キャプチャされたコンテンツが文字化けして表示されることがよくあります。
これが発生する可能性が最も高いのは、エンコーディングの問題です。実行環境の文字エンコーディングが Web ページの文字エンコーディングと一致しません。
たとえば、utf-8 でエンコードされた Web サイトは Windows コンソール (gbk) にキャプチャされます。または、Mac/Linux ターミナル (utf-8) で gbk でエンコードされた Web サイトをスクレイピングします。ほとんどの Web サイトでは UTF-8 エンコーディングが使用されており、多くの人が Windows を使用しているため、この状況は非常に一般的です。
キャプチャしたコンテンツ内の英語、数字、記号は正しいように見えますが、文字化けが混在している場合は、基本的にこれが当てはまると判断できます。
#この問題を解決するには、Web ページのエンコード方式に従って結果を Unicode にデコードしてから出力します。 Web ページのエンコードが不明な場合は、次のコードを参照してください。
import urllib req = urllib.urlopen("http://some.web.site") info = req.info() charset = info.getparam('charset') content = req.read() print content.decode(charset, 'ignore')
「ignore」パラメータは、デコードできない文字を無視するために使用されます。
ただし、この方法は常に機能するとは限りません。もう 1 つの方法は、正規表現を使用して Web ページ コードのエンコード設定を直接照合することです。
<meta>
文字化けを引き起こすエンコードの問題に加えて、見落とされがちな別の状況があります。ターゲット Web ページでは gzip 圧縮が有効になっています 。 Web ページを圧縮すると、送信されるデータが少なくなり、より速く開くことができます。ブラウザで開くと、Web ページのヘッダー情報に基づいてブラウザが自動的に解凍します。ただし、コードを使用して直接取得することはできません。したがって、Web ページのアドレスを開くのは正しいのに、プログラムでアドレスを取得しないのはなぜなのか、混乱するかもしれません。私自身もこの問題に騙されたことがあります。
この状況では、キャプチャされたコンテンツがほとんどすべて文字化けしており、表示することさえできません。 Web ページで圧縮が有効になっているかどうかを確認し、それを解凍するには、次のコードを参照できます。import urllib import gzip from StringIO import StringIO req = urllib.urlopen("http://some.web.site") info = req.info() encoding = info.getheader('Content-Encoding') content = req.read() if encoding == 'gzip': buf = StringIO(content) gf = gzip.GzipFile(fileobj=buf) content = gf.read() print content教室でのプログラミングのサンプル天気予報シリーズ (クリックして表示) では、これらのコードを参照できます。 2つの問題で悩んでいる人は少なくありません。ここで特別に説明しておきます。 最後に、もう一つ「鋭い武器」を紹介します。最初から使っていると、上記の2つの問題が存在することさえわかりません。 これは
requests モジュールです。
同様に Web ページをクロールします。必要なのは次のことだけです。import requests print requests.get("http://some.web.site").textエンコードの問題や圧縮の問題はありません。 これが私が Python を愛する理由です。リクエスト モジュールのインストール方法については、前の記事を参照してください:Python のサードパーティ モジュールをインストールする方法-クロッシンのプログラミング教室- 志胡コラム
pip install requests
以上がPythonでキャプチャしたWebページが文字化けする原因と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。