日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:pythonurllib2中文亂碼怎么解決

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

創(chuàng)新互聯(lián)公司是一家專注于成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計,瓊海網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:瓊海等地區(qū)。瓊海做網(wǎng)站價格咨詢:18980820575

另一個造成亂碼的原因是壓縮格式,很多規(guī)模較大的網(wǎng)站都是以gzip的壓縮格式輸出頁面的,所以在用BS解析之前需要先判斷該網(wǎng)頁是否經(jīng)過壓縮,如果經(jīng)過壓縮則先進(jìn)行解壓操作。

相關(guān)推薦:《python教程》

代碼:

# 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

并且頁面的編碼確定為 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)

可是卻得到下面的錯誤:

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’)

終于得到了正確的內(nèi)容和正確的編碼。

問題到這里就解決了,可是對于不能直接使用簡潔的 zlib 庫表示很不甘心,畢竟根據(jù) python 的文檔 gzip 庫也是調(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ù)器會優(yōu)先返回 gzip 后的頁面,這樣極大減少數(shù)據(jù)流的大小,絕大多數(shù)服務(wù)器都是支持 gzip 的。之后對于意外情況,也加入了對 response header 的判斷,對于不包含“Content-Encoding”的數(shù)據(jù)流就不會去對其解壓縮。


當(dāng)前名稱:創(chuàng)新互聯(lián)Python教程:pythonurllib2中文亂碼怎么解決
URL分享:http://www.dlmjj.cn/article/dpiegpe.html