Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Парсинг веб-сайта с кодировкой iso-8859-1 вместо utf-8: как мне сохранить правильный юникод в моей базе данных?

Автор вопроса: Alessandro P.Ответов: 1

Я хотел бы очистить веб-сайт с помощью 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 для выполнения запросов, однако все, что мне нужно, это понять, как правильно хранить в моей базе данных строку, которая исправляет ’, кодируя строку в '.

  • Вы имеете в виду, что когда вы на самом деле посещаете страницу, вы видите неправильные символы или что вы получаете неправильные символы, когда отображаете данные в своем собственном приложении или просматриваете их в базе данных? Как ты его сейчас расчесываешь? Как вы расшифровываете и перекодируете символы? Вы уверены, что страница действительна в кодировке UTF-8, хотя утверждает, что это не так? Wooble 09.05.2012
  • Да, на странице отображаются неправильные символы. Когда я очищаю страницу, она получает именно то, что есть на странице. BeautifulSoup конвертирует все в utf-8, за исключением того, что я явно не кодирую и не декодирую символы. Alessandro P. 09.05.2012

pythonbeautifulsoupunicodeutf-8

Ответы

Ответ 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 и вернув исходную строку, когда это не так. перекодировать.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы