Unicode编码错误:'gbk'编解码器无法编码字符:非法的多字节序列
我想从一个网址获取HTML内容,并用正则表达式来解析这些HTML内容。
但是,这些HTML内容里有一些多字节字符,所以我遇到了标题中提到的错误。
有人能告诉我该怎么解决这个问题吗?
4 个回答
结合上面的回答,我发现以下代码效果很好。
import requests
r = requests.get("https://www.example.com/").content
str_content = r.decode('utf-8')
fp = open("contents.txt","w", encoding='utf-8')
fp.write(str_content)
fp.close()
试试这个
open(file, 'r', encoding='utf-8')
而不是这个
open(file, 'r')
你需要修改你的问题,提供以下信息:(1) 你使用的代码 (2) 完整的错误信息和追踪记录 (3) 涉及的链接 (4) 你想要用gbk编码的unicode字符是什么
看起来你从HTML内容的原始字节中得到了unicode字符——这是怎么做到的?HTML内容中指定了什么编码?
然后(我猜)你是想把这些unicode字符写入一个文件,并将unicode编码为gbk。在这个过程中,你遇到了类似这样的错误:
>>> u'\uffff'.encode('gbk')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'gbk' codec can't encode character u'\uffff' in position 0: illegal multibyte sequence
>>>
如果HTML内容中的原始字节不是用gbk编码的,那么很可能你有一些unicode字符是gbk无法表示的。在这种情况下,你可能想用原始编码来编码你的结果,或者使用gb18030编码,这种编码可以表示任何unicode字符。
还有一种可能是你在某种程度上搞乱了原始字节或unicode字符。我希望你的正则表达式操作是针对unicode进行的,而不是针对像gb2312、gbk这样的可变长度字符编码。
更新:
这是你的代码片段:
import sys, urllib.request
url = "http://www.meilishuo.com"
wp = urllib.request.urlopen(url)
content = wp.read()
str_content = content.decode('utf-8')
fp = open("web.txt","w")
fp.write(str_content)
fp.close()
从中我推测出:
(1) 你正在使用Python 3.x
(2) sys.defaultencoding == "gbk"——否则你不会收到你之前提到的错误信息。
因为我的sys.defaultencoding不是'gbk',所以我把你的最后三行替换成gbk_content = str_content.encode('gbk')
,并在Python 3.1.2中运行了修改后的代码。
观察结果:
(1) 网站的字符集是utf-8,使用utf-8解码正常
(2) 错误信息:UnicodeEncodeError: 'gbk' codec can't encode character '\u2764' in position 35070: illegal multibyte sequence
\u2664
是一个符号(重黑心)。这个网站是动态的;在另一次尝试中,第一个出错的字符是\xa9(版权符号)。
所以这个网页包含了gbk无法映射的unicode字符。你可以选择:
(1) 用'gbk'编码,但使用'replace'选项
(2) 用'gbk'编码,但使用'ignore'选项
(3) 用支持所有unicode字符的编码(utf-8,gb18030),并确保你有一个可以显示这些不在gbk中的字符的机制