Проблемы с кодировкой Python - PullRequest
4 голосов
/ 26 августа 2011

Итак, я много читал о кодировке Python и прочем - возможно, недостаточно, но я работал над этим 2 дня и все еще ничего - но у меня все еще проблемы.Я постараюсь быть максимально ясным.Главное, что я пытаюсь удалить все акценты и символы, такие как #,!,%, & ...

Дело в том, что я выполняю поиск запросов в Twitter Search API с помощью этого вызова:

query = urllib2.urlopen(settings.SEARCH_URL + '?%s' % params)

Затем я вызываю метод (avaliar_pesquisa()) для оценки полученных результатов на основе тегов (или терминов) ввода:

dados = avaliar_pesquisa(simplejson.loads(query.read()), str(tags))

На avaliar_pesquisa() происходит следующее:

def avaliar_pesquisa(dados, tags):
    resultados = []
    # Percorre os resultados
    for i in dados['results']
        resultados.append({'texto'          : i['text'],
                           'imagem'         : i['profile_image_url'],
                           'classificacao'  : avaliar_texto(i['text'], tags),
                           'timestamp'      : i['created_at'],
                         })

Обратите внимание на avaliar_texto(), который оценивает текст Tweet.И есть проблема именно в следующих строках:

def avaliar_texto(texto, tags):
    # Remove accents
    from unicodedata import normalize
    def strip_accents(txt):
        return normalize('NFKD', txt.decode('utf-8'))

    # Split
    texto_split = strip_accents(texto)
    texto_split = texto.lower().split()

    # Remove non-alpha characters
    import re
    pattern = re.compile('[\W_]+')
    texto_aux = []
    for i in texto_split:
        texto_aux.append(pattern.sub('', i))
    texto_split = texto_aux

Разделение здесь не имеет значения.Дело в том, что если я напишу тип var texto в этом последнем методе, я могу получить str или unicode в качестве ответа.Если на тексте есть какой-либо акцент, он выглядит как юникод.Итак, я получаю эту ошибку при запуске приложения, которое получает максимум 100 твитов в качестве ответа:

UnicodeEncodeError: кодек «ascii» не может кодировать символ u «\ xe9» в позиции 17: порядковый номер не находится в диапазоне(128)

Для следующего текста:

Текст: Агора или проблема, скорее быстрая.введите 'unicode'

Есть идеи?

Ответы [ 3 ]

9 голосов
/ 26 августа 2011

См. эту страницу .

Метод decode() должен применяться к объекту str, а не к объекту Юникода.Получив в качестве входных данных строку Unicode, он сначала пытается закодировать ее в строку с использованием кодека ascii, а затем декодировать как utf-8, что не удается.

Попробуйте return normalize('NFKD', unicode(txt) ).

5 голосов
/ 26 августа 2011

Это то, что я использовал в своем коде для удаления акцентов и т. Д.

text = unicodedata.normalize('NFD', text).encode('ascii','ignore')
1 голос
/ 26 августа 2011

Вы размещаете:

# -*- coding: utf-8 -*-

в начале вашего скрипта Python, содержащего код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...