当前位置: 首页 > 面试题库 >

UnicodeEncodeError:'gbk'编解码器无法编码字符:非法的多字节序列

宓博实
2023-03-14
问题内容

我想从网址获取html内容,并使用正则表达式解析html内容。但是html内容具有一些多字节字符。所以我遇到了标题中描述的错误。

有人可以告诉我如何解决这个问题吗?


问题答案:

您需要编辑问题以显示(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’,因此我将最后3行替换为,gbk_content = str_content.encode('gbk')并使用Python 3.1.2运行了经过修改的代码段。

观察结果:

(1)网站具有charset = utf-8,用utf-8解码正常
(2)错误消息:UnicodeEncodeError: 'gbk' codec can't encode character '\u2764' in position 35070: illegal multibyte sequence

\u2664是dingbat(HEAVY BLACK HEART)。网站是动态的;在另一种尝试中,第一个令人反感的字符是\ xa9(COPYRIGHT
SIGN)。

因此,网页包含未在gbk中映射的Unicode字符。选项是

(1)使用’gbk’编码,但使用’replace’选项
(2)使用’gbk’编码,但使用’ignore’选项
(3)使用支持所有Unicode字符(utf-8,gb18030)的编码和为此,您需要使用一种显示机制来渲染所有不在gbk中的字符



 类似资料:
  • 问题内容: 当上传具有非ASCII字符的文件时,出现UnicodeEncodeError: 我使用MySQL,nginx和FastCGI运行Django 1.2。 根据Django Trac数据库,这是已解决的问题,但是我仍然有问题。欢迎提供有关如何修复的任何建议。 编辑:这是我的图像字段: 问题答案: 在对此进行更多调查之后,我发现我尚未在我的主要Nginx配置文件中设置字符集: 通过添加以上内

  • 问题内容: 我是python初学者。 我正在尝试抓取Google Play商店并导出到csv文件。但是我收到一条错误消息。 这是我的源代码。 当我命令打印时,它可以工作。但是在导出到csv文件时显示错误消息 请帮我 问题答案: Python 3以语言环境默认编码打开文本文件;如果该编码无法处理您尝试写入的Unicode值,请选择其他编解码器: 它将所有Unicode字符串编码为UTF-8,该编码可

  • 问题内容: 我正在尝试抓取一个网站,但这给我一个错误。 我正在使用以下代码: 我收到以下错误: 我该怎么做才能解决此问题? 问题答案: 我通过添加将其修复。 那意味着变成。

  • 问题内容: 当我尝试在数据库中插入外来字符时,可能是什么导致此错误? 而我该如何解决呢? 谢谢! 问题答案: 字符U + 201C左双引号在Latin-1(ISO-8859-1)编码中不存在。 这 是 目前在代码页1252(西欧)。这是Windows特定的编码,基于ISO-8859-1,但会将多余的字符放入0x80-0x9F范围内。代码页1252通常与ISO-8859-1混淆,这是一种令人烦恼但现

  • 我正试图抓取一个网站,但它给了我一个错误。 我正在使用以下代码: 我得到了以下错误: 我能做些什么来解决这个问题?

  • 问题内容: 我正在编写一个Python(Python 3.3)程序,以使用POST方法将一些数据发送到网页。通常在调试过程中,我会获取页面结果并使用print()功能将其显示在屏幕上。 代码是这样的: 该方法返回一个bytes编码页面的元素(格式正确的UTF-8文档),直到我停止使用Windows的IDLE GUI并改为使用Windows控制台时,这似乎还可以。返回的页面具有字符(破折号),打印功