UnicodeEncodeError: кодек «gbk» не может кодировать символ: недопустимая многобайтовая последовательность - PullRequest
2 голосов
/ 10 июля 2010

Я хочу получить html-контент из URL и проанализировать html-контент с помощью регулярного выражения.Но содержание html содержит несколько многобайтовых символов.Итак, я встретил ошибку, описанную в заголовке.

Может кто-нибудь сказать мне, как решить эту проблему?

Ответы [ 3 ]

11 голосов
/ 10 июля 2010

Вам нужно отредактировать свой вопрос, чтобы показать (1) код, который вы использовали (2) полную ошибку и трассировку (3) задействованный URL (4) что такое символ unicode , которыйВы пытаетесь кодировать как gbk

Вы, кажется, каким-то образом получили символы Юникода из необработанных байтов в html-содержимом - как?какая кодировка указана в 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, то вполне возможно, что у вас есть некоторые символы Юникода, которые не могутбыть представлен в ГБК.В этом случае вы можете захотеть закодировать свои результаты, используя исходную кодировку, или закодировать их в gb18030, который может принимать любой символ 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) веб-сайт имеет кодировку = utf-8, декодирует ОК с помощью utf-8
(2) Сообщение об ошибке: UnicodeEncodeError: 'gbk' codec can't encode character '\u2764' in position 35070: illegal multibyte sequence

\u2664 - дингбат (ТЯЖЕЛОЕ ЧЕРНОЕ СЕРДЦЕ).Сайт динамичный;в другой попытке первым оскорбительным символом был \ xa9 (COPYRIGHT SIGN).

Таким образом, веб-страница содержит символы Unicode, которые не отображаются в gbk.Возможные варианты:

(1) кодировать с помощью 'gbk', но использовать опцию 'replace'
(2) кодировать с помощью 'gbk', но использовать опцию 'ignore'
(3) кодировать с помощьюкодировка, которая поддерживает ВСЕ символы Unicode (utf-8, gb18030) и для которой у вас есть механизм отображения, который отображает все те символы, которых нет в gbk

3 голосов
/ 03 декабря 2016

Попробуйте

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

вместо

open(file, 'r')
0 голосов
/ 20 февраля 2019

Объединяя приведенные выше ответы, я обнаружил, что следующий код работает очень хорошо.

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