Python 编码问题
我最近在研究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)
对于以下文本:
文本:Agora o problema é com o speedy. 类型 'unicode'
有没有什么想法?
3 个回答
在你的Python脚本开头放上:
# -*- coding: utf-8 -*-
这段代码应该放在包含你代码的Python脚本的最前面。
请查看这个页面。
decode()
这个方法是用在字符串对象上的,而不是用在unicode对象上。如果你给它一个unicode字符串,它会先尝试用ascii编码把它转成字符串,然后再用utf-8解码,这样就会出错。
你可以试试 return normalize('NFKD', unicode(txt) )
。
这是我在代码中用来去掉重音符号等的办法。
text = unicodedata.normalize('NFD', text).encode('ascii','ignore')