這篇文章主要為大家詳細介紹了Python網絡爬蟲出現亂碼問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
關於爬蟲亂碼有很多各式各樣的問題,這裡不只是中文亂碼,編碼轉換、還包括一些如日文、韓文、俄文、藏文之類的亂碼處理,因為解決方式是一致的,故在此統一說明。
網路爬蟲出現亂碼的原因
來源網頁編碼和爬取下來後的編碼格式不一致。
如來源網頁為gbk編碼的位元組流,而我們抓取下後程式直接使用utf-8進行編碼並輸出到儲存檔案中,這必然會引起亂碼即當來源網頁編碼和抓取下來後程式直接使用處理編碼一致時,則不會出現亂碼; 此時再進行統一的字符編碼也就不會出現亂碼了
注意區分
源網編碼A、
編碼B、
統一轉換字元的編碼C。
亂碼的解決方法
1.http header的Content-Type
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
Python chardet 字元編碼判斷
chardet實例
import urllib rawdata = urllib.urlopen('http://www.php.cn/').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.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 '中文'
如果用unicode編碼,以下方式:
s1 = u'中文' #u表示用unicode編碼方式儲存資訊
decode是任何字串具有的方法,將字串轉換成unicode格式,參數指示來源字串的編碼格式。
encode也是任何字串具有的方法,將字串轉換成參數指定的格式。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。
🎜🎜更多Python網路爬蟲出現亂碼問題的解決方法相關文章請關注PHP中文網! 🎜