Вам нужно отредактировать свой вопрос, чтобы показать (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