この記事では主にPython Webクローラーの文字化け問題の解決策を詳しく紹介していますので、興味のある方は参考にしてください。
クローラーの文字化けに関する問題はこれだけではありません。中国語の文字化けだけでなく、日本語、韓国語、ロシア語、チベット語などの一部の文字化けも含めたエンコード変換も解決方法は同じなので説明します。
Webクローラーで文字化けが発生する原因
ソースWebページのエンコード形式とクロール後のエンコード形式が一致していません。
ソース Web ページが gbk によってエンコードされたバイト ストリームであり、それを取得した後、プログラムはそれをエンコードしてストレージ ファイルに出力するために直接 utf-8 を使用します。つまり、ソースが文字化けすることは避けられません。 Webページをエンコードしてキャプチャすると、プログラムが直接処理されるエンコードが統一されていれば文字化けは発生しませんが、このとき文字エンコードが統一されていれば文字化けは発生しません
の区別に注意してください。
ソースWebページのコードAを決定します。コードAはWebページ内の3つの位置にあることがよくあります
2.meta charset
<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'}
独自のクローラーを開発する過程で中国語の文字エンコーディングに対処するにはどうすればよいですか?
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)
pyファイルのデフォルトはASCIIエンコーディングであり、中国語が表示される場合、 ASCII からシステムのデフォルトのエンコード変換に変換されます。「SyntaxError: Non-ASCII Character」というエラーが発生します。コード ファイルの最初の行にエンコード命令を追加する必要があります:
# -*- coding:utf-8 -*- print '中文'上記のように直接入力された文字列は、コード ファイルのエンコード 'utf-8' に従って処理されます
Unicode エンコードが
decode は任意の文字列が持つメソッドで、文字列を Unicode 形式に変換し、パラメータは文字列のエンコード形式を示しますソース文字列。
encode も任意の文字列に備わっているメソッドで、文字列をパラメータで指定された形式に変換します。
以上がこの記事の全内容です。皆さんの学習に役立つことを願っています。また、皆さんも PHP 中国語 Web サイトをサポートしていただければ幸いです。
Python Web クローラーの文字化けの問題を解決する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。