UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multibyte sequence
【问题】
python中已获取网页:
http://blog.csdn.net/hfahe/article/details/5494895
的html源码,其时UTF-8编码的。
提取出其标题部分:
<span class="link_title"><a href="/hfahe/article/details/5494895">
在2008 Beijing Perl 大会的演讲-使用Mason开发高性能的Web站点
</a></span>
中的标题文字:
| 在2008 Beijing Perl 大会的演讲-使用Mason开发高性能的Web站点 |
然后用:
| titleUni = unicode(titleHtml, “UTF-8″); |
或
| titleUni = titleHtml.decode(“UTF-8″); |
将其解码成Unicode,但是却会出错:
| UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multibyte sequence |
【解决过程】
1.Python的编码问题,GB18030,UTF-8,Unicode等问题,之前遇到过很多次了,也就解决了。此处很奇怪的是,
类似的其他的网页,比如:
http://blog.csdn.net/v_july_v/article/details/6543438
http://blog.csdn.net/v_july_v/article/details/5934051
等,对应提取出来的内容,都是可以正常解码为Unicode的。
因为本身其编码的确是Utf-8的。
2.去试了试用chardet.detect分析其真正编码的,得到的结果是:
| encInfo= {‘confidence': 0.99, ‘encoding': ‘utf-8′} |
也是和其他网页内容得到的结果是一样的。
3.此问题觉得很诡异的是,本身调用UTF-8去decode,但是解码出错却提示的是GBK的,而不是UTF-8相关解码出错。
4.找了些其他帖子:
Python UnicodeEncodeError:illegal multibyte sequence
但是讨论的都是关于从Unicode编码为GBK或GB2312,然后出错的。
而我这里的错误是,本身内容是UTF-8的,然后想要还原为Unicode,结果却提示GBK解码错误的。。。
5.这里:探索UTF-8中文编码的BOM标记问题提到了,可能是由于UTF-8的BOM造成的不能正常解码,所以试着去将返回的html导出为html文件,然后用Notepad++查看,结果还是没看出是否有BOM,反正是文字内容,都可以查看到的。
然后也试了类似代码:
| titleUni = titleHtml[1:].decode(“UTF-8″);
titleUni = titleHtml[2:].decode(“UTF-8″); |
但是都还是不行。
后来在这里也看到了,关于UTF-8的BOM的问题的解释,但同样不是我要的。
6.在这里:Python Unicode与中文处理(文摘),看到了:
s.decode(‘gbk’, ‘ignore’).encode(‘utf-8′)
然后才想起来,之前是看到过类似的解释,即添加ignore来忽略非法的字符,然后又参考:
然后去找了对应语法:
str.decode([encoding[, errors]])
Decodes the string using the codec registered for encoding. encoding defaults to the default string encoding. errors may be given to set a different error handling scheme. The default is 'strict', meaning that encoding errors raiseUnicodeError. Other possible values are 'ignore', 'replace' and any other name registered via codecs.register_error(), see section Codec Base Classes.
New in version 2.2.
Changed in version 2.3: Support for other error handling schemes added.
Changed in version 2.7: Support for keyword arguments added.
试了:
| titleUni = titleHtml.decode(“UTF-8″, ‘ignore’); |
和:
| titleUni = titleHtml.decode(“UTF-8″, ‘replace’); |
但是结果仍是:
| print “titleUni=”,titleUni; |
会出现上述“’gbk’ codec can’t encode”的错误。
但是后来无意间发现,在打印titleUni之前,添加了一行调试代码:
| print “len(titleUni)=”,len(titleUni); |
却是可以正常打印的,这就说明,此处的titleUni变量,正常解码为Unicode的值了,即上述decode是正常的。
然后又重新试了试,之前的:
| titleUni = titleHtml.decode(“UTF-8″); |
结果也是一样的,即print “len(titleUni)=”,len(titleUni);也是可以正常输出的。
然后此时才明白,原来出现’gbk’ codec can’t encode”的错误的根本原因是,对于前面的,不论是用
titleHtml.decode(“UTF-8″);
还是
titleHtml.decode(“UTF-8″, ‘ignore’);
还是
titleHtml.decode(“UTF-8″, ‘replace’);
都是可以得到正常的titleUni的Unicode字符的,然后对于此Unicode的字符,需要print出来的话,由于本地系统是Win7中的cmd,默认codepage是CP936,即GBK的编码,所以需要先将上述的Unicode的titleUni先编码为GBK,然后再在cmd中显示出来,然后由于titleUni中包含一些GBK中无法显示的字符,导致此时提示“’gbk’ codec can’t encode”的错误的。
【总结】
对于此(类)问题:
(1)出现UnicodeEncodeError –> 说明是Unicode编码时候的问题;
(2) ‘gbk’ codec can’t encode character –> 说明是将Unicode字符编码为GBK时候出现的问题;
此时,往往最大的可能就是,本身Unicode类型的字符中,包含了一些无法转换为GBK编码的一些字符。
解决办法是:
- 方案1:
在对unicode字符编码时,添加ignore参数,忽略无法无法编码的字符,这样就可以正常编码为GBK了。
对应代码为:
| gbkTypeStr = unicodeTypeStr.encode(“GBK“, ‘ignore’); |
- 方案2:
或者,将其转换为GBK编码的超集GB18030 (即,GBK是GB18030的子集):
| gb18030TypeStr = unicodeTypeStr.encode(“GB18030“); |
对应的得到的字符是GB18030的编码。
【题外话】
对于上述中,将原先的utf-8的字符转换为Unicode的时候,其实更加安全的做法,也可以将:
titleUni = titleHtml.decode(“UTF-8″);
替换为:
titleUni = titleHtml.decode(“UTF-8″, ‘ignore’);
这样可以实现,即使对于那些,相对来说是无关紧要的一些特殊字符,也可以成功编码,避免编码出错,提高程序的健壮性。
【后记 2012-12-01】
后来,专门花精力,总结了最常见的一些类型,感兴趣的可以去看看:
【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法
UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multibyte sequence的更多相关文章
- 解决“UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 24051: illegal multibyte sequence”错误
今天我在爬取一个网页时出现了下面这个错误: UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 240 ...
- UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multib
[问题] 在执行代码时,提示上述错误,源码如下: # 下载小说... def download_stoy(crawl_list,header): # 创建文件流,将各个章节读入内存 with open ...
- 解决UnicodeEncodeError: 'gbk' codec can't encode character u'\u25aa' in position 344 : illegal multiby
Python拿来做爬虫的确很不错,但是字符串的编码的确是稍不留神就是一个坑,GBK编码和Unicode编码的转化出现问题也是很多的,今天在解析网页数据的时候出现上述错误,解决方案如下: one_str ...
- Python读取中文txt文件错误:UnicodeEncodeError: 'gbk' codec can't encode character
with open(file,'r') as f: line=f.readline() i=1 while line: line=line.decode('utf-8') line=f.readlin ...
- 解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX
从网上抓了一些字节流,想打印出来结果发生了一下错误: UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position ...
- UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 1987: illegal multibyte sequence
在爬取 url = "http://stats.meizhou.gov.cn/show/index/1543/1689" 时出现了问题: UnicodeEncodeError: ' ...
- [转]Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
使用Python写文件的时候,或者将网络数据流写入到本地文件的时候,大部分情况下会遇到:UnicodeEncodeError: 'gbk' codec can't encode character ' ...
- UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 30633: illegal multibyte sequence
import urllib.request def load_baidu(): url = "https://www.baidu.com/" header = {"Use ...
- [python]UnicodeEncodeError: 'gbk' codec can't encode character '\ufffd'
有关编码问题,一直以来都是十分头疼的问题.代码中的字符编码其实还好,但是由于使用的window系统,会用Window的默认编码去解析文本. 今天用脚本在写文件的时候,就总是弹出UnicodeEncod ...
随机推荐
- (五)mysql表操作和约束条件
(1)表基本操作 1)创建表 create table 表名(字段 数据类型 约束条件) mysql> create table student1(id int,name varchar(50) ...
- 区间DP【p4290】[HAOI2008]玩具取名
Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用"WING"中 ...
- Linux命令之vi/vim(一)
vi仅仅是一个文本编辑器,可以给字符着色,可以自动补全,但不具备windows下word的排版功能.Vim是Vi improved的缩写,是vi的改进版. vi和vim的区别: 多级撤销.在vi中按u ...
- 35、Django实战第35天:完善点击数/ 收藏数
点击数--课程 当我们进入一个课程的详情页的时候,点击数+1 当我们点击“我要学习”的时候,该课程的学习人数+1 点击数--教师 当我们进入一个讲师的详情页的时候,点击数+1 点击数--机构 当我们进 ...
- Html5+CSS
1. 内联样式是为元素添加样式的最简单有效的方式,但是更易于维护的方式是使用层叠样式表CSS(Cascading Style Sheets). <style> 选择器 {属性名称: 属性 ...
- Eclipse 教程 | 菜鸟教程
http://www.runoob.com/eclipse/eclipse-charset.html
- ant脚本调用.bat文件
build.xml内容如下: <project name="example" default="test"> <target name=&qu ...
- 【整体二分+莫比乌斯函数+容斥原理】BZOJ2440
[题目大意] 求第k个不是完全平方数或完全平方数整数倍的数. [思路] 由于μ(i)*(n/i^2)=n,可以直接从1开始,得出非完全平方数/完全平方数倍数的数的个数 注意一下二分的写法,这里用的是我 ...
- Access转Sqlite的最简单的方法(不需要DB Manager)
在网上查了很多方法,大部分都是需要DB Manager,但是DB Manager这个牛逼保护机制做得好,没有免费的注册码可用.还好下面有另一个办法实现Access转Sqlite: 首先要下载SQLit ...
- Git学习笔记(二) 远程仓库及分支
添加远程仓库(以GitHub为例) 所谓的远程仓库,其实就和本地仓库一样,只是我们本地电脑可能会关机什么的.远程仓库的目的就是保证7*24小时开启状态.GitHub是一个很好的公共Git远程仓库(后面 ...