【问题】
在执行代码时,提示上述错误,源码如下:
1 # 下载小说... 2 def download_stoy(crawl_list,header): 3 4 # 创建文件流,将各个章节读入内存 5 with open('E:\盗墓test22.txt', 'w') as f: 6 for each_url in crawl_list: 7 # 有的时候访问某个网页会一直得不到响应,程序就会卡到那里,我让他0.6秒后自动超时而抛出异常 8 while True: 9 try: 10 request = urllib.request.Request(url=each_url, headers=header) 11 with urllib.request.urlopen(request, timeout=0.6) as response: 12 html = response.read().decode('utf-8') 13 break 14 except: 15 # 对于抓取到的异常,让程序停止1.1秒,再循环重新访问这个链接,访问成功时退出循环 16 time.sleep(1.1) 17 18 # 匹配文章标题 19 title_req = re.compile(r'<h1>(.+?)</h1>') 20 # 匹配文章内容,内容中有换行,所以使flags=re.S re.S表示跨行匹配 21 #content_req = re.compile(r'<div class ="content-body">(.+)</div>', re.S) 22 content_req = re.compile(r'<p>(.*?)</p>', re.S) 23 #"<div[^>]+>.+?<div>(.+?)</div></div>", re.I 24 #content_req = re.compile(r'<div[^>]+>.+?<div>(.+?)</div></div>', re.S) 25 # 获取标题 26 title = title_req.findall(html)[0] 27 # 获取内容 28 content_test = content_req.findall(html) 29 print('抓取章节>' + title) 30 f.write(title + '\n') 31 #print(content_test) 32 for each in content_test: 33 # 筛除不需要的的html元素 34 str1 = each.replace('“', ' ') 35 str2 = str1.replace('…', ' ') 36 str3 = str2.replace('”',' ') 37 f.write(str3 + '\n')
【解决过程】
1. 再次确认其编码格式,确实是utf-8;
2.此问题觉得很诡异的是,本身调用UTF-8去decode,但是解码出错却提示的是GBK的,而不是UTF-8相关解码出错。
3.找了其他帖子,尝试在解码时添加ignore 属性,但没有解决。文中提供的第二种解释,直觉不是这个原因。继续找其他帖子。
4.又找到一个,
http://www.jb51.net/article/64816.htm
根据提示,在文件打开时添加 encoding='utf-8', 即,
with open('E:\盗墓test22.txt', 'w',encoding='utf-8') as f:
问题解决。
【参考】