encoding windows 1251 python

Мне нужно получить источник страницы (html) и преобразовать его в uft8, потому что я хочу найти текст на этой странице (например, если «my_same_text» в page_source: then. ). Эта страница содержит русский текст (кириллические символы), и этот тег

Я использую колбу и запрашиваю python lib. я отправляю запрос source = запросы.get(‘url/’)

и я не могу найти свой текст, это связано с кодировкой, как я могу преобразовать текст в utf8? Я пытаюсь использовать.encode().decode(), но это не помогло.

python flask utf-8 python-requests encode

Содержание

  1. 2 ответа
  2. 3 Answers 3
  3. Использование
  4. Строки в скрипте
  5. Загрузка и сохранение файла
  6. Текст в скрипте
  7. Авто-преобразование кодировки
  8. Результат
  9. Пример авто-преобразования кодировок в сравнении
  10. Результат
  11. Вывод списков
  12. Результат:
  13. Установка внешней кодировки при запуске

2 ответа

4 Решение Igor Hatarist [2015-02-06 15:25:00]

Позвольте создать страницу с кодировкой windows-1251 указанную в meta и некоторый русский абсурдный текст. Я сохранил его в Sublime Text как файл windows-1251, конечно.

Вы можете использовать небольшой трюк в библиотеке requests :

Если вы измените кодировку, Requests будет использовать новое значение r.encoding всякий раз, когда вы вызываете r.text.

Так оно и происходит:

Если это не сработает для вас, есть немного уродливый подход.

Вы должны взглянуть на то, какую кодировку посылает вам веб-сервер.

Может быть, кодирование ответа на самом деле является cp1252 (также известным как ISO-8859-1 ) или что-то еще, но ни utf8 ни cp1251 . Он может отличаться и зависит от веб-сервера!

Поэтому мы должны соответствующим образом перекодировать его.

Но это просто выглядит уродливо для меня (также, я сосать кодировки, и это не совсем лучшее решение вообще). Я бы пошел с повторной установкой кодировки с использованием самих requests .

I’m trying to convert file content from Windows-1251 (Cyrillic) to Unicode with Python. I found this function, but it doesn’t work.

How can I do that?

3 Answers 3

Is this what you intend to do?

This is just a guess, since you didn’t specify what you mean by «doesn’t work».

If the file is being generated properly but appears to contain garbage characters, likely the application you’re viewing it with does not recognize that it contains UTF-8. You need to add a BOM to the beginning of the file — the 3 bytes 0xEF,0xBB,0xBF (unencoded).

If you use the codecs module to open the file, it will do the conversion to Unicode for you when you read from the file. E.g.:

This only makes sense if you’re working with the file’s data in Python. If you’re trying to convert a file from one encoding to another on the filesystem (which is what the script you posted tries to do), you’ll have to specify an actual encoding, since you can’t write a file in «Unicode».

В python есть 2 объекта работающими с текстом: unicode и str, объект unicode хранит символы в формате (кодировке) unicode, объект str является набором байт/символов в которых python хранит остальные кодировки (utf8, cp1251, cp866, koi8-r и др).

Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте — для разных операций над строками.

Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в «стандарт».

Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.

Использование

Скрипт питона, в самом начале скрипта указываем кодировку файла и сохраняем в ней файл

для того что-бы интерпретатор python понял в какой кодировке файл

Строки в скрипте

Строки в скрипте хранятся байтами, от кавычки до кавычки:

= 6 байт при cp1251

= 12 байт при utf8

Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале :

и если кодировка содержимого в файле отличается от указанной, то в строке могут быть «битые символы»

Загрузка и сохранение файла

Текст в скрипте

Процедуре print текст желательно передавать в рабочей кодировке либо кодировать в кодировку ОС.

Результат скрипта при запуске из консоли windows XP:

a2 = Текст в utf8

b = Текст в unicode

В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт

Авто-преобразование кодировки

В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.

В примере ниже, python сам переводит utf8 в unicode — приводит к одной кодировке для того что-бы сложить строки.

Результат

a = Текст в utf8

b = Текст в unicode

c = Текст в utf8Текст в unicode

Как видим результирующая строка «c» в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.

Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.

Пример авто-преобразования кодировок в сравнении

Результат

1. utf8 and unicode true

2. utf8 and cp1251 false

script.py:10: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode — interpreting them as being unequal

print ‘3. cp1251 and unicode’, ‘true’ if u’Слово’.encode(‘cp1251′) == u’Слово’ else ‘false’

3. cp1251 and unicode false

В сравнении 1, кодировка utf8 преобразовалась в unicode и сравнение произошло корректно.

В сравнении 2, сравниваются кодировки одного вида — обе внешние, т.к. кодированы они в разных кодировках условие выдало что они не равны.

В сравнении 3, выпало предупреждение из за того что выполняется сравнение кодировок разного вида — рабочая и внешняя, а авто-декодирование не произошло т.к. стандартная внешняя кодировка = utf8, и декодировать строку в кодировке cp1251 методом utf8 питон не смог.

Вывод списков

Результат:

1 [‘xd0xa2xd0xb5xd1x81xd1x82’, ‘xd1x81xd0xbfxd0xb8xd1x81xd0xbaxd0xb0’]

2 [‘xd0xa2xd0xb5xd1x81xd1x82’, ‘xd1x81xd0xbfxd0xb8xd1x81xd0xbaxd0xb0’]

При выводе списка, происходит вызов []() который возвращает внутреннее представление этого спиcка — print 1 и 2 являются аналогичными. Для корректного вывода списка, его нужно преобразовать в строку — print 3.

Установка внешней кодировки при запуске

В обучении ребенка важно правильное толкование окружающего его мира. Существует масса полезных журналов которые начнут экологическое воспитание дошкольников правильным путем. Развивать интерес к окружающему миру очень трудный но интересный процесс, уделите этому особое внимание.

Источник: computermaker.info

Понравилась статья? Поделиться с друзьями:
Ок! Компьютер
Добавить комментарий