創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!
創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的漢壽網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!python中urllib2中文亂碼的解決方法?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
很多亂碼問題是編碼造成的,一般對(duì)于中文網(wǎng)站基本是UTF-8,GB2312,可以GB18030通吃。
另一個(gè)造成亂碼的原因是壓縮格式,很多規(guī)模較大的網(wǎng)站都是以gzip的壓縮格式輸出頁(yè)面的,所以在用BS解析之前需要先判斷該網(wǎng)頁(yè)是否經(jīng)過壓縮,如果經(jīng)過壓縮則先進(jìn)行解壓操作。
代碼:
# 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#?L5#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
并且頁(yè)面的編碼確定為 GBK,那么
html.decode('gbk').encode('utf-8')
就可以將機(jī)器碼以 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)
可是卻得到下面的錯(cuò)誤:
zlib.error: Error -3 while decompressing data: incorrect header check
無奈,只得用 gzip 庫(kù)和 StringIO 庫(kù)繞路解決。
import gzip, StringIO html = gzip.GzipFile(fileobj=StringIO.StringIO(html), mode="r") html = html.read().decode('gbk').encode('utf-8’)
終于得到了正確的內(nèi)容和正確的編碼。
問題到這里就解決了,可是對(duì)于不能直接使用簡(jiǎn)潔的 zlib 庫(kù)表示很不甘心,畢竟根據(jù) python 的文檔 gzip 庫(kù)也是調(diào)用 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 中默認(rèn)加入了接受 gzip,服務(wù)器會(huì)優(yōu)先返回 gzip 后的頁(yè)面,這樣極大減少數(shù)據(jù)流的大小,絕大多數(shù)服務(wù)器都是支持 gzip 的。之后對(duì)于意外情況,也加入了對(duì) response header 的判斷,對(duì)于不包含“Content-Encoding”的數(shù)據(jù)流就不會(huì)去對(duì)其解壓縮。
感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)python中urllib2中文亂碼的解決方法大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。