用urllib2读取网页时遇到编码问题

今天尝试了下用urllib2库来读取网页

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2

r = urllib2.urlopen('http://jelivor.com')
html = r.read()
print html

由于目标地址是UTF-8编码的
然后遇到了一个意料之中的问题 -> python2的编码问题
中文乱码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2

r = urllib2.urlopen('http://jelivor.com')
html = r.read()
print html.decode('utf-8').encode('gbk')

运行,报异常
UnicodeEncodeError: 'gbk' codec can't encode character u'\ud83d' in position 11081: illegal multibyte sequence
\ud83d这显然不是一般文字,在gbk编码里没有
那么我们可以给encode()加上参数errors=’ignore’来忽略这些奇怪的字符

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2

r = urllib2.urlopen('http://jelivor.com')
html = r.read()
# print html.decode('utf-8').encode('gbk', 'ignore')
print html.decode('utf-8').encode(encoding='gbk', errors='ignore')

OK 问题解决

或者我们还能这么写

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib2

r = urllib2.urlopen('http://jelivor.com')
html = r.read()
print html.decode('utf-8').encode('mbcs')

执行 可以正常输出中文
那么这个mbcs到底是啥呢?
MBCS叫做多字节字符集(Multi-Byte Character Set)也叫DBCS(双字节字符集,Double-Byte Character Set)
MBCS并不是某一特定编码,其实他就是我们经常见到的ANSI
在windows环境下根据系统设定区域不同,MBCS指代的是不同的编码,中文系统中就是’GBK’
windows的控制台默认用的就是MBCS(中文系统中指代CP936 ANSI/OEM – 简体中文 GBK)
而在linux中则无法使用MBCS