python urllib2中文乱码怎么解决

devtools/2024/12/23 15:39:14/

很多乱码问题是编码造成的,一般对于中文网站基本是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

代码里在 request header 中默认加入了接受 gzip,服务器会优先返回 gzip 后的页面,这样极大减少数据流的大小,绝大多数服务器都是支持 gzip 的。之后对于意外情况,也加入了对 response header 的判断,对于不包含“Content-Encoding”的数据流就不会去对其解压缩。


http://www.ppmy.cn/devtools/48410.html

相关文章

初级网络工程师之从入门到入狱(二)

本文是我在学习过程中记录学习的点点滴滴&#xff0c;目的是为了学完之后巩固一下顺便也和大家分享一下&#xff0c;日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、交换机通过配置acl实现禁止或允许指定起点到指定终点的通信二、NAT网络地址转换使得内网与…

将 x 减到 0 的最小操作数

题⽬要求的是数组「左端右端」两段连续的、和为 x 的最短数组&#xff1b;我们可以转化成求数组内⼀段连续的、和为 sum(nums) - x 的最⻓数组。 a. 转化问题&#xff1a;求 target sum(nums) - x 。如果 target < 0 &#xff0c;问题⽆解&#xff1b; b. 初始化左右指针 …

沙普利值是什么,和沙普利值相结合的更好办法

目录 沙普利值是什么,应用场景有什么,举例说明 在云计算资源分配中举例 场景设定 用户需求和资源使用情况 沙普利值在资源分配中的应用(按需定价,) 归纳 和沙普利值相结合的更好办法 AHP法(层次分析法) ANP法(网络层次分析法) 模糊数学 沙普利值计算举例 沙…

「51媒体」媒体邀约-全国邀请媒体现场报道宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 「51媒体」媒体邀约是一家专注于提供媒体传播方案和执行的服务公司&#xff0c;旨在通过一站式服务帮助企业或个人进行有效的媒体邀约和活动宣传。 「51媒体」提供的不仅仅是简单的媒体邀…

光纤跳线(又称光纤连接器)的种类

光纤跳线&#xff08;又称光纤连接器&#xff09;&#xff0c;也就是接入光模块的光纤接头&#xff0c;也有好多种&#xff0c;且相互之间不可以互用。SFP模块接LC光纤连接器&#xff0c;而GBIC接的是SC光纤连接器。下面对网络工程中几种常用的光纤连接器进行详细的说明&#x…

【纯血鸿蒙】——响应式布局如何实现?

前面介绍了自适应布局&#xff0c;但是将窗口尺寸变化较大时&#xff0c;仅仅依靠自适应布局可能出现图片异常放大或页面内容稀疏、留白过多等问题。此时就需要借助响应式布局能力调整页面结构。 响应式布局 响应式布局是指页面内的元素可以根据特定的特征&#xff08;如窗口…

LangChain实战技巧之五:让模型“自动生成”Prompt(提示词)的两种方式

预备知识 with_structured_output bind_tools 对这两种方式不了解的朋友&#xff0c;可以翻阅我的这篇文章找到用法哈 LangChain实战技巧之三&#xff1a;关于Tool的一点拓展 实现方法 方法一 步骤一 # 首先&#xff0c;新建一个提示词抽取器 prompt_extractor ChatPr…

RWA系统系统介绍

RWA系统&#xff0c;即风险加权资产计量系统&#xff0c;是银行风险管理的一个重要工具。 RWA系统通过整合信用风险、市场风险和操作风险的风险加权资产计量&#xff0c;实现资本充足率等监管指标的智能化计算与监控。它采用多种计量方法&#xff0c;如标准法和内评法&#xf…