您好,登錄后才能下訂單哦!
python中urllib2中文亂碼的解決方法?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家帶來的參考內容,讓我們一起來看看吧!
很多亂碼問題是編碼造成的,一般對于中文網站基本是UTF-8,GB2312,可以GB18030通吃。
另一個造成亂碼的原因是壓縮格式,很多規模較大的網站都是以gzip的壓縮格式輸出頁面的,所以在用BS解析之前需要先判斷該網頁是否經過壓縮,如果經過壓縮則先進行解壓操作。
代碼:
# coding: u8 import urllib2 url = "http://sports.sina.com.cn/g/premierleague/index.shtml" response = urllib2.urlopen(url) html = response.read() print html
輸出:
w?83’?L/J .uV?[w5;:S煝{7l!Zp8′-y?=ePUs?;__Zj ::]K? eY?kV%IBUVY”*’)?S. JT>”TTZk+!x*)ld2I,kUU?/kXjjkHI U0n2}jUS?”>!pj^[?g’o^=Nq?7n|57yy’\ul j=9T,g/t0?7’^o|v}>8=7?!tp??gFS?zd~`MuC%U2\ f?Vq?7~2~?lE=}M}Xwo}us’>?*zpS:7O?~чb= HK!s?inQR}@TsY|,#b\d+#yM@qaRTPVNw ?[((tGP,A$O/EXP)oNgA\`Z 4 eL7?Vn+ ?eR fT`&W?bV f{ j_p@-@[Ib_?CZ’!4O1C,?hy b0W(?Z?V5-?X)5{EkvXYN (PPUCk?? j( V3{Z!LOOP+LP%WPL!\=! @XD8?jpT,W+#we~? {CBo@_Y+ijp;^,=(h :NxH|Ar]-|Bkq< ?+}.?lt.)cptRXJ4CJ?Bv@BXdP&6dógsR^=/fb@s#m} uZh.V80_)$.1W hS*zQJ?|?{nIPa±a#?L<SA %^yg2*\fxJhQh_FBK(c%cBKwaHeRB 8w6<?K @.k*[k|^_1BV;,pu]24Y Bw?Cm3`>5#FzFG-%? W0A{T?#u4@e24?*:*6?t&XGe@dc%c?h|?y$HhGv3s$(Y)sYMvE@lC(.tk?6K(E;Op1?: D6wО?fO&zqZ3Z>0MC{?i#. tP?u-u-t38X Wt2h!.>9;TVKrj_$yABZ?6.?I\yK:¬ s#lhsxzb=INse/FUad4H3lnHo0T^”j*]yfrMY!?-#I(YVaΡ@1kE?2=qRt?h@y@(GX)I-Z$lNX,vg^~cE /虬&jz=АUdY__\FGA} …
首先想到編碼問題
isinstance(html, str) == True
并且頁面的編碼確定為 GBK,那么
html.decode('gbk').encode('utf-8')
就可以將機器碼以 gbk 解碼,再重新以 utf-8 編碼,就可以得到正確的文本。可是收到這樣的提示:
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 1-2: illegal multibyte sequence
可能是以 gzip 壓縮格式輸出造成的亂碼,于是嘗試通過 zlib 解壓縮。
import zlib html = zlib.decompress(html)
可是卻得到下面的錯誤:
zlib.error: Error -3 while decompressing data: incorrect header check
無奈,只得用 gzip 庫和 StringIO 庫繞路解決。
import gzip, StringIO html = gzip.GzipFile(fileobj=StringIO.StringIO(html), mode="r") html = html.read().decode('gbk').encode('utf-8’)
終于得到了正確的內容和正確的編碼。
問題到這里就解決了,可是對于不能直接使用簡潔的 zlib 庫表示很不甘心,畢竟根據 python 的文檔 gzip 庫也是調用 zlib 來解壓的,為什么不直接用 zlib 呢?最終代碼如下:
request = urllib2.Request(url) request.add_header('Accept-encoding', 'gzip') opener = urllib2.build_opener() response = opener.open(request)html = response.read() gzipped = response.headers.get('Content-Encoding') if gzipped: html = zlib.decompress(html, 16+zlib.MAX_WBITS) print html
代碼里在 request header 中默認加入了接受 gzip,服務器會優先返回 gzip 后的頁面,這樣極大減少數據流的大小,絕大多數服務器都是支持 gzip 的。之后對于意外情況,也加入了對 response header 的判斷,對于不包含“Content-Encoding”的數據流就不會去對其解壓縮。
感謝各位的閱讀!看完上述內容,你們對python中urllib2中文亂碼的解決方法大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。