Перевод многобайтовых символов в 7-битный ASCII в Python
========================================================

Я загружаю и анализирую веб-страницу через скрипт Python. Мне нужно, чтобы он был закодирован в 7-битный ASCII для дальнейшей обработки. Я использую библиотеку запросов (<http://docs.python-requests.org/en/master/>) в virtualenv, основанном на том, что есть в Ubuntu 16.04 LTS.

Я бы хотел, чтобы пакет запросов или какой-то другой пакет обрабатывал перевод в ASCII, не требуя от меня дальнейшего перевода закодированных символов, потому что я знаю, что пропущу некоторые символы. Детали следующие:

Мой текущий скрипт Python, показанный ниже, использует кодировку ISO-8859-1 в попытке принудительно преобразовать данные результата в 7-битный ASCII с некоторым частичным успехом. Но я установил кодировку результатаа также также закодировать текст, когда он выходит. Это кажется странным и, на самом деле, совершенно неправильным. Но даже если я живу с этим, у меня есть главная проблема, которая заключается в следующем:

Даже после кодирования, я вижу штрихи, закодированные в том, что, кажется, находится в некотором наборе символов не ASCII. Как будто символы тире проскальзывали через кодировку запросов. Приведенный ниже сценарий решает эту проблему путем поиска и замены многобайтовой кодировки тире на символ ASCII. Это не имеет большого значения, если это один многобайтовый символ, но подозреваю, что есть другие символы, которые нужно будет перевести на другие веб-страницы, которые я хочу обработать. Нужно ли просто использовать какую-либо другую кодировку, отличную от «ISO-8859-1», с объектом запросов?

Вот мой скрипт (с использованием Python 2.7.11 на Ubuntu 16.04 LTS на x86\_64):

Вызов simple\_wget.py в рамках virtualenv показывает:

Передача этого выхода через`oc -cb` чтобы увидеть восьмеричные значения ("342 200 223") символов тире, соответствующих`r'\xe2\x80\x93'` в сценарии выше:

Вещи, которые я пробовал:

<https://stackoverflow.com/a/19645137/257924> подразумевает использование кодировки`ascii`, но он задыхается внутри библиотеки запросов. Меняем скрипт на:

выходы:

Изменение последней строки выше, чтобы быть

в результате черточки просто удаляются, а не переводятся, а это не то, что я хочу.

И это тоже не работает вообще:

потому что это дает эту ошибку:

что, насколько я могу понять из<https://stackoverflow.com/a/10385520/257924>, из-за того, что «данные» не являются строкой Unicode. Таблица перевода из 256 символов не будет делать то, что мне нужно. И кроме того, это излишне: что-то внутри Python должно переводить эти многобайтовые символы, не требуя взлома кода на моем уровне сценария.

Кстати, меня не интересует многоязычный перевод страниц. Ожидается, что все переведенные страницы будут на американском или британском английском.

 что вам нужно для чистой обработки не ASCII-символов ... при условии, что вы объявите правильную кодировку. Ваш входной файл в кодировке UTF8, а не ISO-8859-1, потому что`r'\xe2\x80\x93'` является кодировкой UTF8 для символа EN DASH или Unicode`U+2013`.

Итак, вы должны:

загрузить текст из запроса в виде истинной строки Unicode:

переведитеоскорбительный персонажи**в юникоде**:

Это будет работать сейчас, потому что`translate` Карта отличается для байтовых и юникодных строк. Для байтовых строк таблица перевода должна быть строкой длиной 256, тогда как для строк Unicode она должна быть отображением ординалов Unicode в ординалы Unicode, строки Unicode или None ([ref: Справочное руководство по стандартной библиотеке Python](https://docs.python.org/2/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange)).

тогда вы можете безопасно кодировать данные в байтовую строку ascii:

Приведенная выше команда выдаст исключение, если в переводчике останутся не переведенные не ascii символы`data` Строка Юникода. Вы можете видеть это как помощь, чтобы быть уверенным, что все так же успешно преобразовано.