Python: 'gbk' codec can't encode character '\u30fb' in position 0: illegal multibyte sequence

news/2024/11/26 11:46:18/

先上代码:

代码是通过爬去王者荣耀官方网站的数据,然后再写入文件中,获取的英雄,铭文等信息写入时都没有问题,但是写入装备信息时就出现编码的问题了

 

# -*- coding: utf-8 -*-
"""
Created on Thu Nov 16 16:25:44 2017@author: 10183930
"""import requests
import csv
import re
import osJSONHEAD = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}def getHeroinfo():HERO = 'http://pvp.qq.com/web201605/js/herolist.json'html_hero = requests.get(HERO,headers=JSONHEAD)html_hero = requests.get(HERO)html_hero_json = html_hero.json()#获取英雄列表hero_name = list(map(lambda x:x['cname'],html_hero_json))hero_number = list(map(lambda x:x['ename'],html_hero_json))hero_type = list(map(lambda x:x['hero_type'],html_hero_json))#hero_type2 = list(map(lambda x:x['hero_type2'],html_hero_json))return zip(hero_name,hero_number,hero_type)def getIteminfo():ITEM = 'http://pvp.qq.com/web201605/js/item.json'html_item = requests.get(ITEM,headers=JSONHEAD)html_item = requests.get(ITEM)html_item_json = html_item.json()#获取装备列表item_name = list(map(lambda x:x['item_name'],html_item_json))item_des = list(map(lambda x:x['des1'],html_item_json))return zip(item_name,item_des)def getSummonerinfo():SUMMONER = 'http://pvp.qq.com/web201605/js/summoner.json'html_summoner = requests.get(SUMMONER,headers=JSONHEAD)html_summoner = requests.get(SUMMONER)html_summoner_json = html_summoner.json()#获取召唤师技能列表summoner_des = list(map(lambda x:x['summoner_description'],html_summoner_json))summoner_name = list(map(lambda x:x['summoner_name'],html_summoner_json))summoner_rank = list(map(lambda x:x['summoner_rank'],html_summoner_json))summoner = zip(summoner_name,summoner_des,summoner_rank)return summoner#print(html_summoner_json)def getMinginfo():MING = 'http://pvp.qq.com/web201605/js/ming.json'html_ming = requests.get(MING,headers=JSONHEAD)html_ming = requests.get(MING)html_ming_json = html_ming.json()#获取铭文列表ming_type = list(map(lambda x:x['ming_type'],html_ming_json))ming_name = list(map(lambda x:x['ming_name'],html_ming_json))ming_grade = list(map(lambda x:x['ming_grade'],html_ming_json))ming_des = list(map(lambda x:x['ming_des'],html_ming_json))return zip(ming_type,ming_name,ming_grade,ming_des)def getHerotype():URL = 'http://pvp.qq.com/web201605/herolist.shtml'HTML = requests.get(URL,headers=JSONHEAD)REGEX_number = re.compile(' data-type="(\d)">',re.S)REGEX_type = re.compile('<label>([\u4e00-\u9fa5]{2})</label>',re.S)HTML.encoding = 'GBK'data = HTML.textnumber = REGEX_number.findall(data)herotype = REGEX_type.findall(data)type_dict = dict(zip(number,herotype))return type_dictdef main():'''#召唤师技能fp = open(os.getcwd()+'\\summoner.csv','w+')for item in list(getSummonerinfo()):item = str(item)item = item.replace('(','')item = item.replace(')','')item = item.replace("'",'')item = item.replace("<p>",'')item = item.replace("</p>",'')item = item.replace("</p><p>",' ')fp.writelines(str(item)+'\n')fp.close()#铭文fp = open(os.getcwd()+'\\ming.csv','w+')for item in list(getMinginfo()):item = str(item)item = item.replace('(','')item = item.replace(')','')item = item.replace("'",'')fp.writelines(str(item)+'\n')fp.close()#英雄fp = open(os.getcwd()+'\\hero.csv','w+')for item in list(getHeroinfo()):item = str(item)item = item.replace('(','')item = item.replace(')','')item = item.replace("'",'')fp.writelines(str(item)+'\n')fp.close()'''#装备fp = open(os.getcwd()+'\\item.csv','w+',encoding='utf-8')for item in list(getIteminfo()):item = str(item)item = item.replace('(','')item = item.replace(')','')item = item.replace("'",'')item = item.replace("<p>",'')item = item.replace("</p>",'')item = item.replace("<br>",' ')fp.writelines(item+'\n')#print(item)fp.close()if __name__ == '__main__':main()

 

使用Python写文件的时候,或者将网络数据流写入到本地文件的时候,大部分情况下会遇到:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position ... 这个问题。有时候在用正则表达式时也会遇到另一类的编码问题

‘can't use a string pattern on a bytes-like object’

参见我的博客 http://blog.csdn.net/zoulonglong/article/details/78547191,网络上有很多类似的文件讲述如何解决这个问题,但是无非就是encode,decode相关的,这是导致该问题出现的真正原因吗?不是的。 很多时候,我们使用了decode和encode,试遍了各种编码,utf8,utf-8,gbk,gb2312等等,该有的编码都试遍了,可是编译的时候仍然出现: UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position XXX。 崩溃了。

 

    在windows下面编写python脚本,编码问题很严重。尤其是Python3,Python2这种问题能少一点。在Python3里,有几点关于编码的常识:

1、字符就是unicode字符,字符串就是unicode字符数组

2、str转bytes叫encode,bytes转str叫decode

    将网络数据流写入文件时时,我们会遇到几个编码:

    1: #encoding='XXX' 这里(也就是python文件第一行的内容)的编码是指该python脚本文件本身的编码,无关紧要。只要XXX和文件本身的编码相同就行了。 比如notepad++ "格式"菜单里面里可以设置各种编码,这时需要保证该菜单里设置的编码和encoding XXX相同就行了,不同的话会报错

    2:网络数据流的编码 比如获取网页,那么网络数据流的编码就是网页的编码。需要使用decode解码成unicode编码。

    3:目标文件的编码 要将网络数据流的编码写入到新文件,那么我么需要指定新文件的编码。写文件代码如:

 

f.write(txt) 


那么txt是一个字符串,它是通过decode解码过的字符串。关键点就要来了:目标文件的编码是导致标题所指问题的罪魁祸首。如果我们打开一个文件:

 

 

f = open("out.html","w") 


在windows下面,新文件的默认编码是gbk,这样的话,python解释器会用gbk编码去解析我们的网络数据流txt,然而txt此时已经是decode过的unicode编码,这样的话就会导致解析不了,出现上述问题。 解决的办法就是,改变目标文件的编码:

 

 

f = open("out.html","w",encoding='utf-8') 


这样,问题将不复存在。

 

最后,附上一些常用的和中文有关的编码的名称,分别赋值给encoding,就可以看到不同的效果了:

 

 

编码名称用途
utf8所有语言
gbk简体中文
gb2312简体中文
gb18030简体中文
big5繁体中文
big5hkscs繁体中文

 

 

 


http://www.ppmy.cn/news/520059.html

相关文章

'gbk' codec can't encode character '\u30fb' in position *: illegal multibyte sequence

写文件时编码错误 在open()方法中添加encodingutf-8可解决。

解决Python3控制台输出的UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\u30fb‘ in position 0:问题

解决 Python3控制台输出的UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\u30fb’ in position 0: illegal multibyte sequence问题 最近在GitHub找了一段大神写的机器学习的代码&#xff0c;但是大神是用的python2写的&#xff0c;而我本机是python3的环境&a…

选择大于努力?看涛思数据两名90后如何获得“胡润U30企业领袖奖”

十天前&#xff0c;涛思数据两位92年生的联合创始人程洪泽、侯江燚双双被评为胡润U30中国创业领袖&#xff0c;达成他们人生一个新的里程碑。这不仅是他们个人的骄傲&#xff0c;更是涛思数据的骄傲。洪泽是涛思的第三号员工&#xff0c;江燚是涛思的第六号员工。今天周末&…

最强光源解析,做纺织的你知道D65,CWF,TL84,U30,HOR的区别吗?

最强光源解析&#xff0c;做纺织的你知道D65&#xff0c;CWF&#xff0c;TL84&#xff0c;U30&#xff0c;HOR的区别吗&#xff1f; 我们平时所说的光源&#xff0c;一般分为自然光源和人造光源两种&#xff0c;前者主要指日光&#xff0c;后者则包括白炽灯、卤钨灯、荧光灯、…

内存不足的原因及解决方法

一、剪贴板占用了太多的内存 实际上&#xff0c;剪贴板是内存中的一块临时区域&#xff0c;当你在程序中使用了“复制”或“剪切”命令后&#xff0c;Windows将把复制或剪切的内容及其格式等信息暂时存储在剪贴板上&#xff0c;以供“粘贴”使用。如果当前剪贴板中存放的是一幅…

大数据基础平台实施及运维进阶

1、完全分布式部署介绍 完全分部式是真正利用多台Linux主机来进行部署Hadoop&#xff0c;对Linux机器集群进行规划&#xff0c;使得Hadoop各个模块分别部署在不同的多台机器上。 2、nameNode HA完全分布式部署 2.1、nameNode切换方法 分别处于Active和Standby中 hadoop可以…

苹果笔记本,怎么使用新移动硬盘,现在不能复制文件到移动硬盘

环境 MAC OS 11.7 macbook pro 问题描述 苹果笔记本&#xff0c;怎么使用新移动硬盘&#xff0c;之前硬盘是NTFS格式&#xff0c;macOS默认只能读不能写入 解决方案 1.插入移动硬盘&#xff0c;搜索打开磁盘工具 2.选中当前移动硬盘&#xff0c;点击右上角抹掉 3.选择格…

苹果笔记本电脑我的计算机在哪里设置密码,苹果笔记本怎么设置开机密码_苹果笔记本如何设置开机密码-win7之家...

为了确保电脑安全&#xff0c;大家都喜欢给电脑设置开机密码&#xff0c;但是苹果笔记本电脑跟windows电脑设置方法是不一样的&#xff0c;一些刚使用苹果笔记本电脑的用户们想要设置开机密码&#xff0c;但是却不知道要怎么设置&#xff0c;其实方法并不难&#xff0c;随小编一…