Python 之 解碼漢字亂碼(若是gbk、utf8都試過不行,能夠試試這個)

原由:

使用 requests.get(url) 獲取頁面內容,並打印出來後顯示以下:javascript

 

使用 type() 查看類型也是 <type 'unicode'>java

print [content] 顯示的也是像utf-8的樣子:[u'<div class="gw-error-body">\n\t\t<h1>API\xe5\xbc\x80\xe6\x94\xbe\xe5\xb9\xb3\xe5\x8f\xb0</h1>\n\t\t<h2>\xe8\xae\xa4\xe8\xaf\x81\xe5\xa4\xb1\xe8\xb4\xa5\xef\xbc\x9a</h2>\n\t\t<p>\xe5\xba\x94\xe7\x94\xa8\xe5\xb0\x9a\xe6\x9c\xaa\xe6\xb3\xa8\xe5\x86\x8c\xef\xbc\x8c\xe6\x88\x96\xe6\x98\xaf\xe6\xb2\xa1\xe6\x9c\x89\xe8\xae\xbf\xe9\x97\xae\xe5\xaf\xb9\xe5\xba\x94\xe8\xb5\x84\xe6\xba\x90\xe7\x9a\x84\xe6\x9d\x83\xe9\x99\x90\xe3\x80\x82</p>\n\t\t<p>\n\t\t\t<button class="block-btn" onclick="javascript:history.back(-1);" >\xe8\xbf\x94\xe5\x9b\x9e</button>\n\t\t</p>\n\t</div>'],要注意開頭的u,正常的utf-8是沒有這個的。python

也沒有BOM頭,utf-8,utf-16, utf8-sig,gbk試了個遍也沒打印出中文,後來終於找到個解決辦法。服務器

解決辦法I :----是個辦法,但不是正規辦法

content.encode("latin1").decode("utf-8")
 
緣由:

原文:https://www.v2ex.com/t/304608app

取到的網頁文字內容在編碼上存在必定的 trick ,簡單來講就是 unicode 形式的 gbk 編碼內容,形如: u'\xd6\xb0\xce\xbb\xc3\xe8\xca\xf6'

而事實上,這個字符串實際所要表達的 gbk 編碼內容爲
'\xd6\xb0\xce\xbb\xc3\xe8\xca\xf6',對應的漢字字符爲「職位描述」

解這個問題可參見
http://stackoverflow.com/questions/14539807/convert-unicode-with-utf-8-string-as-content-to-str

能夠看到,關鍵之處在於利用瞭如下這一特性:
Unicode codepoints U+0000 to U+00FF all map one-on-one with the latin-1 encoding

先將 unicode 字符串編碼爲 latin1 字符串,編碼後保留了等價的字節流數據。
而此時在這個問題中,這一字節流數據又偏偏對應了 gbk 編碼,所以對其進行解碼便可還原最初的 unicode 字符。
不過值得注意的是,須要肯定的是形如\xd6\xb0 到底是 utf8 編碼仍是相似 gbk 類型的其餘編碼,
這一點對於最終正確還原 unicode 字符一樣重要。

綜上所述,對拿到的 content 執行如下操做便可:
content.encode("latin1").decode("gbk")
ui

 

解決辦法II :----正規辦法

1 resp = requests.get('http://www.******') 2 print resp.encoding # ISO-8859-1
3 print resp.apparent_encoding # GB2312
4 resp.encoding = resp.apparent_encoding 5 content = resp.text 6 print content
緣由:

原文:http://xiaorui.cc/2016/02/19/%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90python-requests%E5%BA%93%E4%B8%AD%E6%96%87%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98/requests會從服務器返回的響應頭的 Content-Type 去獲取字符集編碼,若是content-type有charset字段那麼requests才能正確識別編碼,不然就使用默認的 ISO-8859-1. 通常那些不規範的頁面每每有這樣的問題。
因此,經過 resp.apparent_encoding 來查看本頁面使用的編碼(上例子中爲GB2312),在明確了網頁的字符集編碼後可使用 resp.encoding = 'GB2312' 獲取正確結果。
編碼

 

完整代碼:

1 # coding=utf-8
2 import requests 3 
4 resp = requests.get('http://www.******') 5 resp.encoding = resp.apparent_encoding 6 print resp.text 7 
8 
9 # print resp.text.encode("latin1").decode("utf-8") # 這裏的utf-8改爲gbk就會報錯,但有時候又狀況相反,因此以爲這不是個正規辦法

運行:url

相關文章
相關標籤/搜索