Python網路爬蟲出現亂碼問題的解決方案,python爬蟲

來源:互聯網
上載者:User

Python網路爬蟲出現亂碼問題的解決方案,python爬蟲

關於爬蟲亂碼有很多各式各樣的問題,這裡不僅是中文亂碼,編碼轉換、還包括一些如日文、韓文 、俄文、藏文之類的亂碼處理,因為解決方式是一致的,故在此統一說明。

網路爬蟲出現亂碼的原因

源網頁編碼和爬取下來後的編碼格式不一致。
如源網頁為gbk編碼的位元組流,而我們抓取下後程式直接使用utf-8進行編碼並輸出到隱藏檔中,這必然會引起亂碼 即當源網頁編碼和抓取下來後程式直接使用處理編碼一致時,則不會出現亂碼; 此時再進行統一的字元編碼也就不會出現亂碼了

注意區分

  • 源網編碼A、
  • 程式直接使用的編碼B、
  • 統一轉換字元的編碼C。

亂碼的解決方案

確定源網頁的編碼A,編碼A往往在網頁中的三個位置

1.http header的Content-Type
擷取伺服器 header 的網站可以通過它來告知瀏覽器一些頁面內容的相關資訊。 Content-Type 這一條目的寫法就是 "text/html; charset=utf-8"。

2.meta charset

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

3.網頁頭中Document定義

<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); } 

在擷取源網頁編碼時,依次判斷下這三部分資料即可,從前往後,優先順序亦是如此。
以上三者中均沒有編碼資訊 一般採用chardet等第三方網頁編碼智能識別工具來做

安裝: pip install chardet

官方網站: http://chardet.readthedocs.io/en/latest/usage.html

Python chardet 字元編碼判斷

使用 chardet 可以很方便的實現字串/檔案的編碼檢測 雖然HTML頁面有charset標籤,但是有些時候是不對的。那麼chardet就能幫我們大忙了。
chardet執行個體

import urllib rawdata = urllib.urlopen('http://www.bkjia.com/').read() import chardet chardet.detect(rawdata) {'confidence': 0.99, 'encoding': 'GB2312'} 

chardet可以直接用detect函數來檢測所給字元的編碼。函數傳回值為字典,有2個元素,一個是檢測的可信度,另外一個就是檢測到的編碼。

在開發自用爬蟲過程中如何處理漢字編碼?
下面所說的都是針對python2.7,如果不加處理,採集到的都是亂碼,解決的方法是將html處理成統一的utf-8編碼 遇到windows-1252編碼,屬於chardet編碼識別訓練未完成

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.bkjia.com/').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也是任何字串具有的方法,將字串轉換成參數指定的格式。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.