關於 BeautifulSoup3 對 gb2312 編碼的網頁解析的亂碼問題,【這篇文章】提出了一個勉強能用的解決方法。即若是中文頁面編碼是 gb2312,gbk,在 BeautifulSoup 構造器中傳入 fromEncoding="gb18030" 參數便可解決亂碼問題,即便分析的頁面是 utf8 的頁面使用 gb18030 也不會出現亂碼問題!如: html
from urllib2 import urlopen from BeautifulSoup import BeautifulSoup page = urllib2.urlopen('http://www.baidu.com'); soup = BeautifulSoup(page,fromEncoding="gb18030") print soup.originalEncoding
爲何網頁是 utf8 傳入 gb18030 依然可以正常解析呢? python
這是因爲,BeautifulSoup 的編碼檢測順序爲: 編碼
1. 建立 Soup 對象時傳遞的 fromEncoding 參數;
2. XML/HTML 文件本身定義的編碼;
3. 文件開始幾個字節所表示的編碼特徵,此時能判斷的編碼只多是如下編碼之一:UTF-#,EBCDIC 和 ASCII;
4. 若是你安裝了 chardet,BeautifulSoup 就會用 chardet 檢測文件編碼;
5. UTF-8;
6. Windows-1252。 url
所以,當傳入 fromEncoding="gb18030" 編碼參數與 html 文件編碼不匹配時,BeautifulSoup 並不會拋出異常,而是按照預約義的編碼檢測順序,按照 utf8 來解析,所以也能夠勉強獲得正確結果! spa