起因:
使用 requests.get(url) 獲取頁面內容,並打印出來后顯示如下:
使用 type() 查看類型也是 <type 'unicode'>
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是沒有這個的。
也沒有BOM頭,utf-8,utf-16, utf8-sig,gbk試了個遍也沒打印出中文,后來終於找到個解決辦法。
解決辦法I :----是個辦法,但不是正規辦法
原文:https://www.v2ex.com/t/304608
取到的網頁文字內容在編碼上存在一定的 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")
解決辦法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就會報錯,但有時候又情況相反,所以覺得這不是個正規辦法
運行: