1
RIcter 2014-01-28 20:54:36 +08:00
一般我碰上这种问题,以xxx为例..
首先,#coding=utf-8在第一行不可少 当然随你喜欢可以换成#coding: utf-8 或者#coding: -*- utf-8 -*- 然后xxx = xx 开始尝试如下: print str(xxx) print str(xxx).decode('utf-8') print str(xxx).encode('utf-8') print str(xxx).decode('gbk') print str(xxx).encode('gbk') print xxx.decode('utf-8') print xxx.encode('utf-8') print xxx.decode('gbk') print xxx.encode('gbk') 以上。 如果还不能解决,你看看页面编码是啥.. 还不行..反正我是行.. |
2
binux 2014-01-28 20:56:16 +08:00
html.decode('gbk', 'replace')
|
3
richiefans 2014-01-28 20:59:21 +08:00 2
明显是gzip过的吧
def fetchHtml(url): #url="http://www.baidu.com/s?wd="+urllib2.quote(keyword) try: request = urllib2.Request(url) request.add_header('Accept-encoding', 'gzip') opener = urllib2.build_opener() f = opener.open(request) isGzip = f.headers.get('Content-Encoding') #print isGzip if isGzip : compresseddata = f.read() compressedstream = StringIO.StringIO(compresseddata) gzipper = gzip.GzipFile(fileobj=compressedstream) data = gzipper.read() else: data = f.read() return data except exceptions,e: print e #returnhtml=urllib2.urlopen(url).read() return fetchHtml(url) |
4
binux 2014-01-28 21:06:55 +08:00
@richiefans urllib2默认又不发gzip头。。
LZ的代码也仅仅是编码问题 |
5
RIcter 2014-01-28 21:17:40 +08:00
我在我电脑上正常跑啊..lz为何有错 orz
|
6
2ex 2014-01-28 21:22:07 +08:00 1
import sys
reload(sys) sys.setdefaultencoding("UTF-8") |
7
stockss 2014-01-28 22:49:02 +08:00
# -*- coding: UTF-8 -*-
import urllib2 url = "http://sports.sina.com.cn/g/premierleague/index.shtml" response = urllib2.urlopen(url) html = response.read() print html |
8
destec 2014-01-28 23:17:50 +08:00
可以试试这个
import urllib2 url = "http://sports.sina.com.cn/g/premierleague/index.shtml" response = urllib2.urlopen(url) html = response.read() print html.decode('gb2312', 'ignore').encode('utf-8') 我把楼上的方法都试了,都是乱码。。 |
9
destec 2014-01-28 23:19:13 +08:00
漏了一句,原页面第5行定义了charset
<meta http-equiv="Content-type" content="text/html; charset=gb2312" /> |
10
picasso250 2014-01-29 00:08:23 +08:00
position 1-2: illegal multibyte sequence 打出十六进制,将不合法的逐一替换为空。或许只是几个字的编码有问题。
|
11
larryzh OP 折腾了一下,应该是如 3 楼所说是 gzip 过的缘故。我使用
|
12
larryzh OP 囧了,上面那个回复按错发出去了,删不掉,这里继续
折腾了一下,应该是如 3 楼所说是 gzip 过的缘故。我使用: html = gzip.GzipFile(fileobj=StringIO.StringIO(html), mode="r") html = html.read().decode('gbk').encode('utf-8') 终于输出可读的内容了,编码也正确了。 于是,对于 gzip 解码又有了个疑问,就是为什么不能直接用 zlib.decompress() 来直接解压缩字符串,而非要通过 gzip 和 StringIO 麻烦兮兮地绕道呢?如果我使用: html = zlib.decompress(html) 会输出错误: zlib.error: Error -3 while decompressing data: incorrect header check Google一下发现了: http://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib 有同学遇到类似的问题,也可以参考这里。 主贴中的问题算是解决了,非常感谢所有楼上的同学! |
15
Crossin 2014-01-29 10:50:04 +08:00
之前也踩过这个坑,抓sina默认拿到被gzip过的
|
18
cloverstd 2014-01-29 13:02:16 +08:00
gzip
我之前抓新浪,有时返回的是gzip压缩过的,有时没有gzip压缩 我是这样判断的 flag = 'Content-Encoding' in headers and headers['Content-Encoding'] == "gzip" |
19
mengzhuo 2014-01-29 16:32:17 +08:00
自侦测编码的库——>chardet
你值得拥有 |
20
crazycookie 2014-01-31 23:45:10 +08:00
请使用 requests 库
|
21
dingyaguang117 2014-02-06 15:53:08 +08:00
目测应该是 gzip 或者其他方式压缩,按理说你没有上传 accept-encoding 服务器不应该给你压缩的,不过有的就是这么不遵循规则。
解压之后decode依然可以会有问题,decode('gbk','ignore') 就好了 ,是部分编码解析不了 |