Я хотел бы очистить веб-сайт с помощью Python, который полон ужасных проблем, одной из которых является неправильная кодировка вверху:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
Это неправильно, потому что страница полна вхождений, подобных следующему:
Nell’ambito
вместо
Nell'ambito (обратите внимание, что ’ заменяет ')
Если я правильно понимаю, это происходит потому, что байты utf-8 (вероятно, кодировка базы данных) интерпретируются как байты iso-8859-1 (вынужденные кодировкой в метатеге). Я нашел некоторые начальные объяснения по этой ссылке http://www.i18nqa.com/debug/utf8-debug.html
Я использую BeautifulSoup для навигации по странице, urfetch Google App Engine для выполнения запросов, однако все, что мне нужно, это понять, как правильно хранить в моей базе данных строку, которая исправляет ’, кодируя строку в '.
Ответ 1 · рейтинг 8 · bobince
Я использую BeautifulSoup для навигации по странице, URL-адрес Google App Engine для запросов
Вы вводите кодировку из HTTP-заголовка Content-Type в BeautifulSoup?
Если HTML-страница имеет и заголовок Content-Type, и метатег, заголовок должен "выиграть", поэтому, если вы используете только метатег, вы можете получить неправильную кодировку.
В противном случае вы можете либо передать фиксированную кодировку 'utf-8' в Beautiful, либо исправить каждую строку по отдельности.
Раздражающее примечание: на самом деле это не ISO-8859-1. Когда веб-страницы указывают ISO-8859-1, браузеры на самом деле воспринимают это как кодовую страницу Windows 1252, которая похожа на 8859-1, но не совпадает с ней. € может указывать на cp1252, потому что его нет в 8859-1.
u'Nell’ambito'.encode('cp1252').decode('utf-8')
Если содержимое закодировано несовместимо с некоторыми UTF-8 и некоторыми cp1252 на той же странице (обычно из-за плохой обработки содержимого базы данных), это будет единственный способ восстановить его, поймав UnicodeError и вернув исходную строку, когда это не так. перекодировать.