Web ページを巡回する Python のエンコード処理に関する簡単な説明

高洛峰
リリース: 2017-02-22 11:13:22
オリジナル
2305 人が閲覧しました

背景

中秋節の期間中、友人が私にメールを送ってきました。蓮家に登っているときに、ウェブページから返されたコードがすべて文字化けしていることに気づき、手伝ってほしいとのことでした。彼のアドバイス (中秋節の間は残業する、本当に献身的です) = =!)、私は実際にずっと前に小説を読んでいたときにこの問題に遭遇しましたが、実際には真剣に受け止めていませんでした。この問題は、私のコーディングに対する理解が不十分なために発生します。

問題

非常に一般的なクローラーコードです。コードは次のようなものです:

# 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のコンテンツをクロールするだけですが、この方法を実行すると、返される結果はすべてです 中国語のコンテンツになると、このようなデータはすべて文字化けしてしまいます

Web ページを巡回する Python のエンコード処理に関する簡単な説明

<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(&#39;utf8&#39;)
ログイン後にコピー

を使用することはお勧めできません。ただし、特定の時点で影響がなければ、怠惰であることは大きな問題ではありません。ただし、ソース ファイルを取得した後、エンコードとデコードを使用してテキストを処理することをお勧めします。

質問に戻ります

現在の最大の問題は、ソースファイルのエンコード方法です。通常、リクエストを使用すると、ソースファイルのエンコード方法を自動的に推測して、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(&#39;utf8&#39;)

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(&#39;utf8&#39;)

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
ログイン後にコピー

印刷結果は明らかで、中国語の文字が正しく表示されます。

Web ページを巡回する Python のエンコード処理に関する簡単な説明

もう 1 つの方法は、ソース ファイルをデコードしてエンコードすることです。コードは次のとおりです。

# ecoding=utf-8
import requests
import sys
reload(sys)
sys.setdefaultencoding(&#39;utf8&#39;)

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 サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!