爬虫Python字符集GBKGB18030MySQL
优采云 发布时间: 2021-08-02 02:04
爬虫Python字符集GBKGB18030MySQL
Python爬虫采集(1):网页和数据库的字符集不一致)过程中遇到的坑
关键词: Crawler Python 字符集 GBK GB18030 MySQL
最近在采集雅昌艺术网站data遇到字符集问题,分享如下:
self.__df.to_csv(self.__file_name, encoding='GBK', index=False)
UnicodeEncodeError:'gbk' 编*敏*感*词*无法在字符 u'\u200e' 上执行位置 43:非法多字节序列
原因是'\u200e'是GB18030编码,不是GBK编码。有兴趣的可以移步这个链接查看原因:CSDN。
GB18030可以编码70000多个汉字,GBK只能编码20000多个汉字,yachang网站,艺术家或画廊的名字,有GBK编码中没有的稀有字符,导致出现上述错误。
于是修改编码方式为GB18030,运行正常。
self.__df.to_csv(self.__file_name, encoding='GB18030', index=False)
UnicodeEncodeError:'gbk' 编*敏*感*词*无法在字符 u'\u200e' 上执行位置 43:非法多字节序列
想了很多办法,decode to,encode to go,最后采用了下面这个trick。
将网页数据存储在一个csv中,然后将csv中非GBK编码的内容删除(删除与艺术家或画廊相关的生僻字,可惜...),然后保存再来一遍。
最后从文件中读取到dataframe,然后存入MySQL数据库。
import re
def killAnUnseen(s):
try:
s.encode('gbk')
# print("return" + s)
return s
except UnicodeEncodeError as err:
mode = re.findall(r'position ([0-9]*): illegal multibyte sequence', str(err))
# if mode:
# print("position:" + mode[0])
# print(s[int(mode[0])])
news = s.replace(s[int(mode[0])], "", 1)
return killAnUnseen(news)
result = []
with open(file_name, 'r', encoding='GB18030') as f: # py3默认utf-8编码
lines = f.readlines()
for line in lines:
try: # 尝试gbk编码
line.encode('gbk')
except UnicodeEncodeError: # 编码失败,去掉无法编码的字符
print(line)
line = killAnUnseen(line)
result.append(line)
with open(file_name, 'w', encoding='gbk') as f_new:
f_new.writelines(result)
你还有什么好的办法吗?你可以评论和给我发私信。