背景
中秋節の期間中、友人が私にメールを送ってきました。蓮家に登っているときに、ウェブページから返されたコードがすべて文字化けしていることに気づき、手伝ってほしいとのことでした。彼のアドバイス (中秋節の間は残業する、本当に献身的です) = =!)、私は実際にずっと前に小説を読んでいたときにこの問題に遭遇しましたが、実際には真剣に受け止めていませんでした。この問題は、私のコーディングに対する理解が不十分なために発生します。
問題
非常に一般的なクローラーコードです。コードは次のようなものです:
# ecoding=utf-8 import re import requests import sys reload(sys) sys.setdefaultencoding('utf8') url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/' res = requests.get(url) print res.text
目的は実際には非常に単純で、Lianjiaのコンテンツをクロールするだけですが、この方法を実行すると、返される結果はすべてです 中国語のコンテンツになると、このようなデータはすべて文字化けしてしまいます
<script type="text/template" id="newAddHouseTpl"> <p class="newAddHouse"> 自从您上次æµè§ˆï¼ˆ<%=time%>)之åŽï¼Œè¯¥æœç´¢æ¡ä»¶ä¸‹æ–°å¢žåŠ 了<%=count%>å¥—æˆ¿æº <a href="<%=url%>" class="LOGNEWERSHOUFANGSHOW" <%=logText%>><%=linkText%></a> <span class="newHouseRightClose">x</span> </p> </script>
。
問題分析
ここでの問題は明らかです。つまり、テキストのエンコードが正しくないため、文字化けが発生します。
Webページのエンコードを確認してください
クロール対象のWebページのヘッダーから、Webページはutf-8でエンコードされています。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
したがって、最終的なエンコードには utf-8 を使用する必要があります。つまり、最終的なテキスト処理は utf-8 でデコードする必要があります。つまり、decode('utf- 8')
テキストのエンコードとデコード
Pythonのエンコードとデコードの処理はこんな感じで、ソースファイル ===》encode(エンコード方法) ===》decode(デコード方法)、大きくはある程度、テキスト エンコーディングをハード処理するために
import sys reload(sys) sys.setdefaultencoding('utf8')
を使用することはお勧めできません。ただし、特定の時点で影響がなければ、怠惰であることは大きな問題ではありません。ただし、ソース ファイルを取得した後、エンコードとデコードを使用してテキストを処理することをお勧めします。
質問に戻ります
現在の最大の問題は、ソースファイルのエンコード方法です。通常、リクエストを使用すると、ソースファイルのエンコード方法を自動的に推測して、Unicodeエンコードにトランスコードします。ただし、結局のところ、プログラムなので、推測が間違っている可能性があるため、推測が間違っていた場合は、エンコード方法を手動で指定する必要があります。公式ドキュメントでは次のように説明されています:
リクエストを行うと、Requests は HTTP ヘッダーに基づいて応答のエンコードを推測します。r.text にアクセスすると、Requests によって推測されたテキスト エンコードが使用されます。リクエストが使用しているエンコーディングを調べ、r.encoding プロパティを使用して変更します。
それでは、リクエストによってどのエンコーディングメソッドが返されるかを確認する必要があるでしょうか?
# ecoding=utf-8 import re import requests from bs4 import BeautifulSoup import sys reload(sys) sys.setdefaultencoding('utf8') url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/' res = requests.get(url) print res.encoding
印刷結果は次のとおりです:
ISO-8859-1
つまり、ソース ファイルは ISO-8859-1 を使用してエンコードされます。 Baidu が ISO-8859-1 を検索した結果は次のとおりです:
ISO8859-1、通常は Latin-1 と呼ばれます。 Latin-1 には、すべての西ヨーロッパ言語を記述するために不可欠な追加文字が含まれています。
問題解決
これを発見した後は、エンコーディングを指定する限り、問題は簡単に解決され、中国語を正しく入力できます。コードは次のとおりです。
# ecoding=utf-8 import requests import sys reload(sys) sys.setdefaultencoding('utf8') url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/' res = requests.get(url) res.encoding = ('utf8') print res.text
印刷結果は明らかで、中国語の文字が正しく表示されます。
もう 1 つの方法は、ソース ファイルをデコードしてエンコードすることです。コードは次のとおりです。
# ecoding=utf-8 import requests import sys reload(sys) sys.setdefaultencoding('utf8') url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/' res = requests.get(url) # res.encoding = ('utf8') print res.text.encode('ISO-8859-1').decode('utf-8')
もう 1 つの方法: ISO-8859-1 は latin1 とも呼ばれ、デコードには latin1 を使用するのが通常です。結果。
文字エンコーディングについて詳しく知りたい人は、次の情報を参照してください。
•《すべてのソフトウェア開発者が Unicode と文字セットについて絶対に、積極的に知っておくべき絶対条件 (言い訳はありません!)》
上記の記事では、Web ページをクローリングする Python のコーディング処理について簡単に説明しています。エディター、これが皆さんの参考になれば幸いです。また、皆さんが PHP 中国語 Web サイトをサポートしてくれることを願っています。
Python を使用した Web ページのクローリングのコーディングと処理に関するその他の記事については、PHP 中国語 Web サイトに注目してください。