Что не так с моим кодом?
Что не так в том, что у вас есть try: ... except:
, который маскирует источник проблемы. Если вы удалите предложение except
, вы увидите сообщение об ошибке, сообщающее об основной проблеме:
UnicodeDecodeError: 'gb18030' codec can't decode byte 0xb7 in position 47676: illegal multibyte sequence
Веб-страница не закодирована как GB18030. Страница объявляет себя как GB2312 (предварительный курсор к GB18030), но использование этого в качестве кодировки также не выполняется.
Как решить проблему?
В зависимости от того, что вы хотите сделать с текстом веб-страницы, у вас есть несколько вариантов:
Найдите поддерживаемую Python кодировку, которая работает со страницей, как указано. Это идеальный вариант, но я не смог найти его с помощью короткого поиска. (Использование этого ответа для выяснения того, что, по мнению Chrome, использует страница, также не помогло, поскольку ответ был GBK
, что приводит к ошибке на символе 47676.)
Расшифруйте страницу с помощью более простого обработчика ошибок, такого как res.text(encoding='GB18030', errors='replace')
. Это даст вам хорошее приближение текста с неразборчивыми байтами, представленными как символ замены юникода . Это хороший вариант, если вам нужно найти на странице подстроку или проанализировать ее как текст, и вам нет дела до странного символа где-то в нем.
Откажитесь от идеи декодирования страницы в виде текста и просто используйте res.data()
, чтобы получить байты. Этот вариант лучше всего подходит, если вам нужно заархивировать или кэшировать страницу или проиндексировать ее.