windows 下 python 讓人頭痛的編碼

最近有這樣一個需求,須要抓在百度搜出來的各類網站,用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'
     
相關文章
相關標籤/搜索