起因:

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

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

print [content] 显示的也是像utf-8的样子:[u'<div class="gw-error-body">\n\t\t<h1>API\xe5\xbc\x80\xe6\x94\xbe\xe5\xb9\xb3\xe5\x8f\xb0</h1>\n\t\t<h2>\xe8\xae\xa4\xe8\xaf\x81\xe5\xa4\xb1\xe8\xb4\xa5\xef\xbc\x9a</h2>\n\t\t<p>\xe5\xba\x94\xe7\x94\xa8\xe5\xb0\x9a\xe6\x9c\xaa\xe6\xb3\xa8\xe5\x86\x8c\xef\xbc\x8c\xe6\x88\x96\xe6\x98\xaf\xe6\xb2\xa1\xe6\x9c\x89\xe8\xae\xbf\xe9\x97\xae\xe5\xaf\xb9\xe5\xba\x94\xe8\xb5\x84\xe6\xba\x90\xe7\x9a\x84\xe6\x9d\x83\xe9\x99\x90\xe3\x80\x82</p>\n\t\t<p>\n\t\t\t<button class="block-btn" onclick="javascript:history.back(-1);" >\xe8\xbf\x94\xe5\x9b\x9e</button>\n\t\t</p>\n\t</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'\xd6\xb0\xce\xbb\xc3\xe8\xca\xf6'

而事实上,这个字符串实际所要表达的 gbk 编码内容为
'\xd6\xb0\xce\xbb\xc3\xe8\xca\xf6',对应的汉字字符为“职位描述”

解这个问题可参见
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 字符。
不过值得注意的是,需要确定的是形如\xd6\xb0 究竟是 utf8 编码还是类似 gbk 类型的其他编码,
这一点对于最终正确还原 unicode 字符同样重要。

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

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

 resp = requests.get('http://www.******')
print resp.encoding # ISO-8859-1
print resp.apparent_encoding # GB2312
resp.encoding = resp.apparent_encoding
content = resp.text
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' 获取正确结果。

完整代码:

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

运行:

Python 之 解码汉字乱码(如果gbk、utf8都试过不行,可以试试这个)的更多相关文章

  1. 关于Python matplotlib显示汉字乱码问题

    我也是一个初学者,在今天编程时遇到的一个问题,我是基于Eclipse编写Python代码,在使用matplotlib进行数据可视化时,发现显示不了汉字并且出现乱码问题. (1)使用中文注释时报错: 解 ...

  2. GBK,UTF-8,和ISO8859-1之间的编码与解码

    Unicode.UTF-8 和 ISO8859-1到底有什么区别 将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicod ...

  3. 【Java基础专题】编码与乱码(05)---GBK与UTF-8之间的转换

    原文出自:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html 在很多论坛.网上经常有网友问" 为什么我使用 ...

  4. 编码与乱码(05)---GBK与UTF-8之间的转换--转载

    原文地址:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html [GBK转UTF-8] 在很多论坛.网上经常有网友问“  ...

  5. CentOS7-安装后常见问题--ssh慢,汉字乱码gbk,-locale设置等

    00.ssh 慢问题解决修改:  [test@centos ~]$ sudo vi /etc/ssh/sshd_config /** 使用/命令查找 API 字符串*/ # GSSAPI option ...

  6. Eclipse 乱码解决方案(UTF8 -- GBK)

    UTF8 --> GBK;   GBK --> UTF8 eclipse的中文乱码问题,一般不外乎是由操作系统平台编码的不一致导致,如Linux中默认的中文字体编码问UTF8, 而Wind ...

  7. 解决EditPlus在设置了UTF-8之后,编写的HTML页面仍出现汉字乱码问题

    解决EditPlus在设置了UTF-8之后.编写的HTML页面仍出现汉字乱码问题   相信有些同学在使用EditPlus编写HTML页面时发现,尽管已经设置好了UTF-8的编码格式.但却发现HTML页 ...

  8. C# unicode GBK UTF-8和汉字互转

    界面: 源码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Da ...

  9. 关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    我们最初学习计算机的时候,都学过ASCII编码. 但是为了表示各种各样的语言,在计算机技术的发展过程中,逐渐出现了很多不同标准的编码格式, 重要的有Unicode.UTF.ISO-8859-1和中国人 ...

随机推荐

  1. POJ 2104 K-th Number(主席树模板题)

    http://poj.org/problem?id=2104 题意:求区间$[l,r]$的第k小. 思路:主席树不好理解啊,简单叙述一下吧. 主席树就是由多棵线段树组成的,对于数组$a[1,2...n ...

  2. CSU 1808 地铁(最短路变形)

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1808 题意: Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站, ...

  3. xtu 1242 Yada Number 打表

    Yada Number       Time Limit : 2000 MS   Memory Limit : 65536 KB   Yada Number Problem Description: ...

  4. Codeforces 294D - Shaass and Painter Robot

    294D - Shaass and Painter Robot 思路: 可以用数学归纳法证明一个结论:整个棋盘黑白相间当且仅当边缘黑白相间. 分奇偶讨论又可得出边缘黑色格个数为n+m-2 这样就可以暴 ...

  5. OpenGL入门程序一:绘制简单的矩形

    #include <GL/glut.h> void MyDisplay(void); int main(int argc, char **argv) { //设置窗口的大小 glutIni ...

  6. 雷林鹏分享:Ruby 数据类型

    Ruby 数据类型 本章节我们将为大家介绍 Ruby 的基本数据类型. Ruby支持的数据类型包括基本的Number.String.Ranges.Symbols,以及true.false和nil这几个 ...

  7. English trip -- Review Unit 9 Daily living 日常生活

    主要讲了一个时态:现在进行时   Be动词+Ving  需要记住的有6种规律 1.直接单词后面 + ing    e.g.     watch -> watching 2.是ie结尾的单词,变y ...

  8. Android程序员眼中世界上最遥远的距离

    世界上最遥远的距离,是我在if里你在else里,似乎一直相伴又永远分离: 世界上最痴心的等待,是我当case你是switch,或许永远都选不上自己: 世界上最真情的相依,是你在try我在catch. ...

  9. pandas的concat函数和append方法

    pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, nam ...

  10. Cookie/Session机制详解(非原创)

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...