最近有這樣一個需求,須要抓在百度搜出來的各類網站,用urllib2獲取的html頁面各類亂碼。html
因而我便有2種解決方法。java
1,本身寫decode 和encode ,從response head裏獲取charset,而後用charset的編碼 decode,而後encode成操做系統文件系統的編碼(windows是gbk,linux是utf8),中間發現個庫chardet[https://pypi.python.org/pypi/chardet],貌似python3 已經裏自帶了,2裏沒有,能夠很方便的檢驗字符的編碼,對於一些獲取charset爲null能夠用此判斷。python
2,更簡單的方法,將獲取的html(未知編碼)直接交給beautifulsoup prettfy一下。linux
html =urllib2.urlopen(url).read() # use beautifulsoup 格式化 soup = BeautifulSoup(html) # print 出想要的encoding print(soup.prettify("gbk"))
而後順便研究了下python的編碼問題。windows
#話說python3的能夠不用看下去了,python3和java差很少了,只有str和byte存在了。 #repr將print python內部處理時的編碼,因而可知python2,內部編碼並非unicode >>> unicode('我','utf8') u'\u6211' >>> repr('我') "'\\xe6\\x88\\x91'" # 同上 >>> repr(u'\u6211'.encode('utf8')) "'\\xe6\\x88\\x91'" >>> u'\u6211'.encode('utf8') #'\xe6\x88\x91' >>> print u'\u6211'.encode('utf8') #我 # 無論是gbk仍是utf8編碼的str他們的 unicode 相同 >>> unicode('我','utf8') #u'\u6211' >>> unicode('我'.decode('utf8').encode('gbk'),'gbk') #u'\u6211' #因而可知 同樣的unicode 不一樣的encoding,其內置編碼不一樣 >>>s1 = '聯繫' >>>s2 = '聯繫'.decode('utf8').encode('gbk') >>>repr(s1) #'\xe8\x81\x94\xe7\xb3\xbb' >>>repr(s2) #'\xc1\xaa\xcf\xb5'