爬虫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)

  你还有什么好的办法吗?你可以评论和给我发私信。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线