UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multib

时间:2021-11-28 20:19:40

【问题】

在执行代码时,提示上述错误,源码如下:

 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('&ldquo;', ' ')
35                 str2 = str1.replace('&hellip;', ' ')
36                 str3 = str2.replace('&rdquo;',' ')
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中常见字符编码和解码方面的错误及其解决办法