溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中urllib2中文亂碼的解決方法

發(fā)布時間:2020-09-03 11:30:19 來源:億速云 閱讀:143 作者:小新 欄目:編程語言

python中urllib2中文亂碼的解決方法?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純热?,讓我們一起來看看吧?/p>

很多亂碼問題是編碼造成的,一般對于中文網站基本是UTF-8,GB2312,可以GB18030通吃。

另一個造成亂碼的原因是壓縮格式,很多規(guī)模較大的網站都是以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,服務器會優(yōu)先返回 gzip 后的頁面,這樣極大減少數據流的大小,絕大多數服務器都是支持 gzip 的。之后對于意外情況,也加入了對 response header 的判斷,對于不包含“Content-Encoding”的數據流就不會去對其解壓縮。

感謝各位的閱讀!看完上述內容,你們對python中urllib2中文亂碼的解決方法大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI