首頁  >  文章  >  後端開發  >  Python網路爬蟲出現亂碼問題的解決方法

Python網路爬蟲出現亂碼問題的解決方法

高洛峰
高洛峰原創
2017-02-11 13:13:461473瀏覽

這篇文章主要為大家詳細介紹了Python網絡爬蟲出現亂碼問題的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

網路爬蟲出現亂碼的原因

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

注意區分

  • 源網編碼A、

  • 源網編碼A、

  • 編碼B、

統一轉換字元的編碼C。

亂碼的解決方法

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


1.http header的Content-Type

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


2.meta charset


 

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 可以很方便的實作/字號文件的編碼偵測雖然HTML頁面有charset標籤,但有些時候是不對的。那麼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)


python代碼檔案的編碼

py檔案預設是ASCII編碼,在中文顯示時會做一個ASCII到系統編碼轉換,這時就會出錯:SyntaxError: Non-ASCII character。需要在代碼文件的第一行添加編碼指示:

# -*- coding:utf-8 -*- 
 
print '中文'


像上面那樣直接輸入的字符串是按照代碼文件的編碼'utf-8'來處理的

如果用unicode編碼,以下方式:

s1 = u'中文' #u表示用unicode編碼方式儲存資訊

decode是任何字串具有的方法,將字串轉換成unicode格式,參數指示來源字串的編碼格式。
encode也是任何字串具有的方法,將字串轉換成參數指定的格式。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持PHP中文網。

🎜🎜更多Python網路爬蟲出現亂碼問題的解決方法相關文章請關注PHP中文網! 🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn