zoukankan      html  css  js  c++  java
  • Python 之 解码汉字乱码(如果gbk、utf8都试过不行,可以试试这个)

    起因:

    使用 requests.get(url) 获取页面内容,并打印出来后显示如下:

     

    使用 type() 查看类型也是 <type 'unicode'>

    print [content] 显示的也是像utf-8的样子:[u'<div class="gw-error-body"> <h1>APIxe5xbcx80xe6x94xbexe5xb9xb3xe5x8fxb0</h1> <h2>xe8xaexa4xe8xafx81xe5xa4xb1xe8xb4xa5xefxbcx9a</h2> <p>xe5xbax94xe7x94xa8xe5xb0x9axe6x9cxaaxe6xb3xa8xe5x86x8cxefxbcx8cxe6x88x96xe6x98xafxe6xb2xa1xe6x9cx89xe8xaexbfxe9x97xaexe5xafxb9xe5xbax94xe8xb5x84xe6xbax90xe7x9ax84xe6x9dx83xe9x99x90xe3x80x82</p> <p> <button class="block-btn" onclick="javascript:history.back(-1);" >xe8xbfx94xe5x9bx9e</button> </p> </div>'],要注意开头的u,正常的utf-8是没有这个的。

    也没有BOM头,utf-8,utf-16, utf8-sig,gbk试了个遍也没打印出中文,后来终于找到个解决办法。

    解决办法I :----是个办法,但不是正规办法

    content.encode("latin1").decode("utf-8")
     
    原因:

    原文:https://www.v2ex.com/t/304608

    取到的网页文字内容在编码上存在一定的 trick ,简单来说就是 unicode 形式的 gbk 编码内容,形如: u'xd6xb0xcexbbxc3xe8xcaxf6'

    而事实上,这个字符串实际所要表达的 gbk 编码内容为
    'xd6xb0xcexbbxc3xe8xcaxf6',对应的汉字字符为“职位描述”

    解这个问题可参见
    http://stackoverflow.com/questions/14539807/convert-unicode-with-utf-8-string-as-content-to-str

    可以看到,关键之处在于利用了以下这一特性:
    Unicode codepoints U+0000 to U+00FF all map one-on-one with the latin-1 encoding

    先将 unicode 字符串编码为 latin1 字符串,编码后保留了等价的字节流数据。
    而此时在这个问题中,这一字节流数据又恰恰对应了 gbk 编码,因此对其进行解码即可还原最初的 unicode 字符。
    不过值得注意的是,需要确定的是形如xd6xb0 究竟是 utf8 编码还是类似 gbk 类型的其他编码,
    这一点对于最终正确还原 unicode 字符同样重要。

    综上所述,对拿到的 content 执行以下操作即可:
    content.encode("latin1").decode("gbk")

    解决办法II :----正规办法

    1 resp = requests.get('http://www.******')
    2 print resp.encoding # ISO-8859-1
    3 print resp.apparent_encoding # GB2312
    4 resp.encoding = resp.apparent_encoding
    5 content = resp.text
    6 print content
    原因:

    原文:http://xiaorui.cc/2016/02/19/%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90python-requests%E5%BA%93%E4%B8%AD%E6%96%87%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98/requests会从服务器返回的响应头的 Content-Type 去获取字符集编码,如果content-type有charset字段那么requests才能正确识别编码,否则就使用默认的 ISO-8859-1. 一般那些不规范的页面往往有这样的问题。
    所以,通过 resp.apparent_encoding 来查看本页面使用的编码(上例子中为GB2312),在明确了网页的字符集编码后可以使用 resp.encoding = 'GB2312' 获取正确结果。

     

    完整代码:

    1 # coding=utf-8
    2 import requests
    3 
    4 resp = requests.get('http://www.******')
    5 resp.encoding = resp.apparent_encoding
    6 print resp.text
    7 
    8 
    9 # print resp.text.encode("latin1").decode("utf-8")  # 这里的utf-8改成gbk就会报错,但有时候又情况相反,所以觉得这不是个正规办法

    运行:

  • 相关阅读:
    HDU 5247
    HDU 4965
    CodeForces 445B
    HDU 5835
    CodeForces 731C
    HDU 5783
    CodeForces 660D
    POJ 1631
    HDU 6112
    HDU 5860
  • 原文地址:https://www.cnblogs.com/liuq/p/9849960.html
Copyright © 2011-2022 走看看