【问题标题】:UnicodeEncodeError: 'gbk' codec can't encode character: illegal multibyte sequenceUnicodeEncodeError:“gbk”编解码器无法编码字符:非法多字节序列
【发布时间】:2011-03-14 04:17:59
【问题描述】:

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

谁能告诉我如何解决这个问题?

【问题讨论】:

  • 回复。使用正则表达式解析 html 内容:请参阅:stackoverflow.com/questions/1732348/…
  • @Alan Moore, @Vinay Sajip:问题与 html 或正则表达式无关——结果证明是一个简单的 Unicode 编码问题。我正在编辑标签以反映这一点。

标签: python unicode encode


【解决方案1】:

您需要编辑您的问题以显示 (1) 您使用的代码 (2) 完整错误和回溯 (3) 涉及的 url (4) unicode 字符是什么您正在尝试将编码为 gbk

您似乎以某种方式从 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 编码的,那么很可能你有一些不能用 gbk 表示的 unicode 字符。在这种情况下,您可能希望使用原始编码对结果进行编码,或者将它们编码为 gb18030,它可以采用任何 unicode 字符。

另一种可能性是您以某种方式破坏了原始字节或 unicode。我当然希望你的正则表达式是在 unicode 上完成的,而不是在 gb2312、gbk 等一些可变长度字符编码上完成的。

更新:

这是你的代码 sn-p:

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 运行修改后的 sn-p。

观察:

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

\u2664 是 dingbat(重黑色心脏)。网站是动态的;在另一次尝试中,第一个违规字符是 \xa9(版权符号)。

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

(1) 使用“gbk”进行编码,但使用“替换”选项
(2) 使用 'gbk' 进行编码,但使用 'ignore' 选项
(3) 使用支持所有 Unicode 字符(utf-8、gb18030)的编码进行编码,并且您有一个显示机制来呈现所有那些不在 gbk 中的字符

【讨论】:

  • @user351637:请编辑您的问题;不要将此类信息放在 cmets 中。
  • 我试过用选项编码,都对。首先,使用 utf-8 解码,然后使用选项替换或忽略使用 gbk 编码,最后使用 gbk 解码。
【解决方案2】:

试试

open(file, 'r', encoding='utf-8')

而不是

open(file, 'r')

【讨论】:

    【解决方案3】:

    结合上面的答案,我发现下面的代码效果很好。

    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()
    

    【讨论】:

    • encoding='utf-8' 单独也可以。
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 2019-05-25
    • 2011-09-13
    • 1970-01-01
    • 2015-10-21
    • 2010-12-11
    相关资源
    最近更新 更多