剛開始用BeautifulSoup抓取網頁,遇到中文亂碼問題,在網上搜了一些方法,先記錄於此, 看看哪種方法好用
1、http://leeon.me/a/beautifulsoup-chinese-page-resolve
import urllib2from BeautifulSoup import BeautifulSouppage = urllib2.urlopen('http://www.leeon.me');soup = BeautifulSoup(page,fromEncoding="gb18030")print soup.originalEncodingprint soup.prettify()
如果中文頁面編碼是gb2312,gbk,在BeautifulSoup構造器中傳入fromEncoding="gb18030"參數即可解決亂碼問題,即使分析的頁面是utf8的頁面使用gb18030也不會出現亂碼問題!
經測試,該方法可行,但是在python3和BeautifulSoup4.1下要寫成 from_encoding="gb18030"
2、http://hi.baidu.com/mengjingchao11/item/604b75e5a426fa2e6cabb856
首先我們要引入urllib2包,使用urllib2中的 urlopen開啟指定 的網頁。
page=urllib2.urlopen(網頁url)
charset=page.headers['Content-Type'].split(' Charset=')[1].lower()來找到網頁的編碼格式。
使用BeautifulSoup(page.read(),fromEncoding=charset)使用charset指定的編碼格式來讀取網頁內容。
2、http://hi.baidu.com/dskjfksfj/item/bc658fd1646fef362b35c79b
這兩天用python爬取噹噹網頁上面的商品資訊,對網頁進行解析使用的是beautifulsoup,但是解析的過程中,得到的網頁上面的文本資訊有些顯示出來是正常的,有些則為亂碼。
網上找了好久,期間對python的編碼方式,以及字串的各種編碼方式之間的轉換算是有了初步瞭解,可惜,試了他們提出來的很多方法,都沒有解決問題。最後,仔細琢磨了下文本之間編碼轉換的原理,用這種方法解決了:
由於噹噹網頁的編碼方式是簡體中文gb2312 (查看網頁源碼,可以看到<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />),而python內部的編碼方式為unicode,之前的代碼是這樣的:
contentAll = urllib.urlopen(urlLink).read()
soup = BeautifulSoup.BeautifulSoup(contentAll) #產生BeautifulSoup對象
經過url定位得到html的document對象之後,此時的編碼方式為網頁文本的編碼方式gb2312,此時送進去BeautifulSoup產生一個BeautifulSoup對象則python以為contentAll為unicode編碼,即系統已經以為contentAll為unicode編碼了,這將引起後續顯示為亂碼的問題,因為在網頁上面看網頁的時候如果改變網頁字元編碼的時候就會看到亂碼。
因此在將contentAll送進去產生BeautifulSoup對象之前必須對其進行解碼(decode)為unicode,使用的code為gb2312,修改後的代碼如下所示:
contentAll = urllib.urlopen(urlLink).read()
soup = BeautifulSoup.BeautifulSoup(contentAll.decode('gb2312','ignore')) #產生BeautifulSoup對象
解碼的時候加上ignore參數是因為解碼過程中有一部分貌似不能正常解碼,加上該參數之後能跳過該部分。
後續還需要將得到的資訊寫進本地文本,由於得到的對象都是unicode編碼的,只有將其進行gb2312編碼(encode)才能看到有意義的內容,因此在寫檔案的函數裡面將其使用gb2312進行編碼再寫進文字檔裡面去。如下所示:
def writeFile(data, filepath):
outfile = open(filepath,'ab')
data = data.encode('gb2312','ignore')
outfile.write(data)
outfile.close()
4、http://www.coder4.com/archives/3621
實際上,fromEncoding=”gb18030″並不是一勞永逸的方法,當面對iso-8859-1編碼的中文網頁時,還是會出現亂碼。
BS會亂碼的根源是:其內部猜測編碼的機制並不完善。
因此,最根本的解決方案是,使用編碼自動偵查工具,獲得網頁真實編碼,例如chardet這個模組。然後將擷取到的encoding設定到BS的fromEncoding構造參數中!!!