Python Webクローラーの文字化け問題を解決する方法

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

この記事では主にPython Webクローラーの文字化け問題の解決策を詳しく紹介していますので、興味のある方は参考にしてください。

クローラーの文字化けに関する問題はこれだけではありません。中国語の文字化けだけでなく、日本語、韓国語、ロシア語、チベット語などの一部の文字化けも含めたエンコード変換も解決方法は同じなので説明します。

Webクローラーで文字化けが発生する原因

ソースWebページのエンコード形式とクロール後のエンコード形式が一致していません。
ソース Web ページが gbk によってエンコードされたバイト ストリームであり、それを取得した後、プログラムはそれをエンコードしてストレージ ファイルに出力するために直接 utf-8 を使用します。つまり、ソースが文字化けすることは避けられません。 Webページをエンコードしてキャプチャすると、プログラムが直接処理されるエンコードが統一されていれば文字化けは発生しませんが、このとき文字エンコードが統一されていれば文字化けは発生しません

の区別に注意してください。

ソースネットワークコードAと
  • はプログラムコードBによって直接使用され、
  • コードCは統一変換文字用です。

  • コード文字化けの解決策

ソースWebページのコードAを決定します。コードAはWebページ内の3つの位置にあることがよくあります

1. httpヘッダーのContent-Typeを取得するサイト。サーバーヘッダーを通じて、ブラウザーの一部のページのコンテンツに関する情報を通知できます。 Content-Type エントリは、「text/html; charset=utf-8」として記述されます。

2.meta charset

3. Web ページヘッダーのドキュメント定義


<script type="text/javascript"> 
if(document.charset){ 
 alert(document.charset+"!!!!"); 
 document.charset = 'GBK'; 
 alert(document.charset); 
} 
else if(document.characterSet){ 
 alert(document.characterSet+"????"); 
 document.characterSet = 'GBK'; 
 alert(document.characterSet); 
}<br><p> ソース Web ページのエンコーディングを取得するときは、これら 3 つのデータ部分を前から後ろに順番に判断するだけでよく、優先順位についても同様です。 <br>上記の 3 つの中にはエンコード情報はありません。通常、chardet などのサードパーティの Web ページエンコードインテリジェント識別ツールを使用して実行します</p>
<p></p>Python chardet 文字エンコード判定<p></p>
<p>を使用します。 chardet は string/ を簡単に実装できます。HTML ページにはファイル エンコーディング検出用の charset タグがありますが、正しくない場合があります。そうすれば、シャルデは私たちを大いに助けてくれます。 <br>chardet の例<br></p>
<p></p>
<pre class="brush:php;toolbar:false">import urllib 
rawdata = urllib.urlopen('http://www.php.cn/').read() 
import chardet 
chardet.detect(rawdata) 
{'confidence': 0.99, 'encoding': 'GB2312'}
ログイン後にコピー


chardet は、 detect 関数を直接使用して、指定された文字のエンコーディングを検出できます。関数の戻り値は 2 つの要素を含む辞書で、1 つは検出の信頼性、もう 1 つは検出されたエンコーディングです。



独自のクローラーを開発する過程で中国語の文字エンコーディングに対処するにはどうすればよいですか?

以下はすべて python2.7 の場合です。処理しないと、収集されたデータが文字化けします。解決策は、HTML を統一したものに処理することです。 utf- 8 エンコーディングは、完了していないchardetエンコーディング認識トレーニングに属するwindows-1252エンコーディングに遭遇します

import chardet 
a='abc' 
type(a) 
str 
chardet.detect(a) 
{'confidence': 1.0, 'encoding': 'ascii'} 
 
 
a ="我" 
chardet.detect(a) 
{'confidence': 0.73, 'encoding': 'windows-1252'} 
a.decode('windows-1252') 
u'\xe6\u02c6\u2018' 
chardet.detect(a.decode('windows-1252').encode('utf-8')) 
type(a.decode('windows-1252')) 
unicode 
type(a.decode('windows-1252').encode('utf-8')) 
str 
chardet.detect(a.decode('windows-1252').encode('utf-8')) 
{'confidence': 0.87625, 'encoding': 'utf-8'} 
 
 
a ="我是中国人" 
type(a) 
str 
{'confidence': 0.9690625, 'encoding': 'utf-8'} 
chardet.detect(a) 
# -*- coding:utf-8 -*- 
import chardet 
import urllib2 
#抓取网页html 
html = urllib2.urlopen('http://www.jb51.net/').read() 
print html 
mychar=chardet.detect(html) 
print mychar 
bianma=mychar['encoding'] 
if bianma == 'utf-8' or bianma == 'UTF-8': 
 html=html.decode('utf-8','ignore').encode('utf-8') 
else: 
 html =html.decode('gb2312','ignore').encode('utf-8') 
print html 
print chardet.detect(html)
ログイン後にコピー


Pythonコードファイルのエンコーディング

pyファイルのデフォルトはASCIIエンコーディングであり、中国語が表示される場合、 ASCII からシステムのデフォルトのエンコード変換に変換されます。「SyntaxError: Non-ASCII Character」というエラーが発生します。コード ファイルの最初の行にエンコード命令を追加する必要があります:

# -*- coding:utf-8 -*- 
 
print '中文'
ログイン後にコピー

上記のように直接入力された文字列は、コード ファイルのエンコード 'utf-8' に従って処理されます

Unicode エンコードが

s1 = u'中国語' #u は Unicode エンコードで情報を格納することを意味します

decode は任意の文字列が持つメソッドで、文字列を Unicode 形式に変換し、パラメータは文字列のエンコード形式を示しますソース文字列。

encode も任意の文字列に備わっているメソッドで、文字列をパラメータで指定された形式に変換します。


以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。

Python Web クローラーの文字化けの問題を解決する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート