很多乱码问题都是由编码引起的。一般对于中文网站,基本都是UTF-8,GB2312,GB18030都可以。
造成乱码的另一个原因是压缩格式。许多大型网站以 gzip 压缩格式输出页面。所以在用BS解析之前,需要先判断网页是否被压缩过。如果是压缩包,先解压。 .
代码:
# 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
代码在请求头中默认接受gzip,服务端会优先返回gzip后的页面,大大减少了数据流的大小。大多数服务器都支持 gzip。之后,对于突发情况,还增加了对响应头的判断,不包含“Content-Encoding”的数据流将不会被解压。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ pandas中join()的两种应用方法09/22
- ♥ python3可以写app吗?11/23
- ♥ python如何在函数中调用数组10/18
- ♥ 70个数据分析常用网址,我先收藏了!01/16
- ♥ 如何在python中使用rfind函数10/19
- ♥ 如何使用 pip 安装 python 库09/23
内容反馈