最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • python urllib2中文乱码怎么解决

    正文概述    2020-07-08   227

    python urllib2中文乱码怎么解决

    很多乱码问题是编码造成的,一般对于中文网站基本是UTF-8,GB2312,可以GB18030通吃。

    另一个造成乱码的原因是压缩格式,很多规模较大的网站都是以gzip的压缩格式输出页面的,所以在用BS解析之前需要先判断该网页是否经过压缩,如果经过压缩则先进行解压操作。

    相关推荐:《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^[LJg’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{EkvXÝN (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|^_¹BV;,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中文乱码怎么解决

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元