【问题】
在执行代码时,提示上述错误,源码如下:
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 ????????????????????????break14 ????????????????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.I24 ????????????#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 属性,但没有解决。文中提供的第二种解释,直觉不是这个原因。继续找其他帖子。
https://www.crifan.com/unicodeencodeerror_gbk_codec_can_not_encode_character_in_position_illegal_multibyte_sequence/
4.又找到一个,
http://www.jb51.net/article/64816.htm
根据提示,在文件打开时添加 encoding=‘utf-8‘, 即,
???with open(‘E:\盗墓test22.txt‘, ‘w‘,encoding=‘utf-8‘) as f:
问题解决。
【参考】
【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法
UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multib
原文地址:https://www.cnblogs.com/scios/p/8624419.html