这个错误我是发生在以下代码:
re.findall(pattern, data)
这个时候如何data的数据类型为bytes,时,就会包这个错误,因为它需要的是字符串。
我们可以把上面的代码改成
type(data)
re.findall(pattern, data)
打印的结果:
<class 'str'>
所以我们要在使用re.findall()方法之前,先把data类型转为字符串str类型。方法:
re.findall(pattern, data.decode('utf-8'))
其中decode和encode方法转换流程:
decode encode
bytes ------> str(unicode)------>bytes
参考链接:
http://blog.csdn.net/moodytong/article/details/8136258
http://blog.csdn.net/riyao/article/details/3629910
第二个参考链接中说:现在`python3`中findall参数类型改了为`chart-like`也就是str,
我这里要说明下,我查了官方文档,即使在python2中也是str类型。参数类型并没有改。
出现这个原因是首先你的header里面配置了
'Accept-Encoding':' gzip, deflate'
其次就是调read()方法时,又调了decode('utf-8')方法,如下:
data = op.read().decode('utf-8')
#因为op.read()数据还没有解压再去调decode()方法会报上面异常;
Accept-Encoding这句话:本地可以接收压缩格式的数据,而服务器在处理时就将大文件压缩再发回客户端,
浏览器在接收完成后在本地对这个文件又进行了解压操作。出错的原因是因为你的程序没有解压这个文件。
重点来了:网上给的答案是,把Accept-Encoding删除掉
我认为既然都知道是没有解压的原因,我们解压不就行了,何必删除。
况且像知乎这样的网站,你爬来的数据不解压都读取不出来。
所以我们正确的做法应该是先解压数据,这里给出我的解压代码:
# 解压
def ungzip(data):
try:
print('正在解压。。。。')
data = gzip.decompress(data)
#data = gzip.decompress(data).decode('utf-8')
print('解压完毕')
except:
print('未经压缩,无需解压')
return data.decode('utf-8')
我这里读取的代码要这样写
data = op.read()
#data = op.read().decode('utf-8')
#千万别写成这样,因为op.read()数据还没有解压再去调decode()方法会报上面异常;
data = ungzip(data)
首先我给出全部代码:
# -*- coding:utf-8 -*-
import re
import urllib
import urllib.request
import gzip
import http.cookiejar
import io
import sys
import string
# gb18030
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# 解压
def ungzip(data):
try:
print('正在解压。。。。')
data = gzip.decompress(data)
print('解压完毕')
except:
print('未经压缩,无需解压')
return data.decode('utf-8')
# 获取xsrf
def getXSRF(data):
cer = re.compile('name="_xsrf" value="(.*)"', flags=0)
strlist = cer.findall(data)
return strlist[0]
# 封装好请求头
def getOpener(head):
# deal with the Cookies
cj = http.cookiejar.CookieJar()
pro = urllib.request.HTTPCookieProcessor(cj)
opener = urllib.request.build_opener(pro)
header = []
for key, value in head.items():
elem = (key, value)
header.append(elem)
opener.addheaders = header
return opener
# 保存
def saveFile(data):
data = data.encode('utf-8')
save_path = 'E:\\temp.out'
f_obj = open(save_path, 'wb') # wb表示打开方式
f_obj.write(data)
f_obj.close()
# 请求头值
header = {
'Connection': 'Keep-alive',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
'Accept-Encoding': 'gzip,deflate',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36',
'Host': 'www.qiushibaike.com'
}
# page = 1
url = 'http://www.qiushibaike.com/hot/'
# 获得请求头
# opener = getOpener(header)
# op = opener.open(url)
# data = op.read()
# data = ungzip(data) # 解压
# _xsrf = getXSRF(data.decode())
try:
opener = getOpener(header)
op = opener.open(url)
data = op.read()
data = ungzip(data)
# op = urllib.request.urlopen(url)
strRex = ('