Python编码问题

4

我已经阅读了许多关于Python编码和相关内容的文章,也许还不够,但我已经在这上面工作了两天,仍然没有结果。我会尽力讲清楚问题。主要问题是我正在尝试去除所有的重音和字符,如#、!、%、& ...

问题是,我使用以下调用对Twitter搜索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()函数,它评估推文的文本。以下几行代码存在问题:

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

在这里,分裂并不重要。重要的是,如果我在这个最后的方法中打印变量texto的类型,我可能会得到str或unicode作为答案。如果文本中有任何重音,它就会像unicode一样出现。所以,当应用程序接收到最多100条推文时,我会得到以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 17: ordinal not in range(128)

对于以下文本:

Text: 现在问题出现在速度上了。 类型:“unicode”

有任何想法吗?


哪一行代码导致了这个错误信息?你有回溯吗? - Jong Bor Lee
你的代码哪一行出现了UnicodeEncodeError错误? - Russell Borogove
@Jong 精确的行在规范化函数上。 - Leonardo Pessoa
3个回答

9
请参考这个页面decode()方法应该作用于str对象,而不是unicode对象。如果输入的是一个unicode字符串,它会首先尝试使用ascii编解码器将其编码为str,然后再使用utf-8解码,但是这种方式通常无法成功。
请尝试使用 return normalize('NFKD', unicode(txt) ) 方法。

将您的解决方案与上面接受的方案混合。非常感谢! - Leonardo Pessoa

5

以下是我在代码中使用的方法,可以去掉重音等字符。

text = unicodedata.normalize('NFD', text).encode('ascii','ignore')

2
为此,我得到了:TypeError:必须是unicode,而不是str。因此,如下所建议的,我在normalize()函数内添加了unicode(text)转换。非常感谢! - Leonardo Pessoa

1

尝试放置:

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

在包含代码的 Python 脚本开头。


1
我认为这只影响程序文本本身的解释,而不影响来自外部源的任何数据。 - Russell Borogove
从我所了解的情况来看,如果你在代码开头放置这个内容,你的Python代码将会被解释为utf8,也就是说包括所有字符串。我曾经遇到过罗马尼亚字符的类似问题,并通过在顶部添加这个来解决它。 - Laur Ivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接