¿Cómo convertir caracteres acentuados Unicode a ascii puro sin acentos?

Estoy intentando descargar contenido de un sitio de diccionario como http://dictionary.reference.com/browse/apple?s=t

El problema que tengo es que el párrafo original tiene todas esas líneas onduladas y letras inversas, y así, cuando leo los archivos locales termino con esos divertidos personajes de escape como \ x85, \ xa7, \ x8d, etc. .

Mi pregunta es, ¿hay alguna manera de convertir todos esos caracteres de escape en sus respectivos caracteres UTF-8, por ejemplo, si hay un ‘à’, cómo lo convierto en un ‘a’ estándar?

Código de llamada Python:

import os word = 'apple' os.system(r'wget.lnk --directory-prefix=G:/projects/words/dictionary/urls/ --output-document=G:\projects\words\dictionary\urls/' + word + '-dict.html http://dictionary.reference.com/browse/' + word) 

Estoy usando wget-1.11.4-1 en un sistema Windows 7 (no me maten los usuarios de Linux, era un requisito del cliente), y el wget exe se está activando con un archivo de script Python 2.6.

¿Cómo convierto todos esos caracteres de escape en sus respectivos caracteres, como si hubiera un unicode a , cómo lo convierto en un estándar a ?

Supongamos que ha cargado su Unicode en una variable llamada my_unicode … normalizar à en un es este simple …

 import unicodedata output = unicodedata.normalize('NFD', my_unicode).encode('ascii', 'ignore') 

Ejemplo explícito …

 >>> myfoo = u'àà' >>> myfoo u'\xe0\xe0' >>> unicodedata.normalize('NFD', myfoo).encode('ascii', 'ignore') 'aa' >>> 

Cómo funciona
unicodedata.normalize('NFD', "insert-unicode-text-here") realiza una Descomposición Canónica (NFD) del texto Unicode; luego usamos str.encode('ascii', 'ignore') para transformar los caracteres mapeados de NFD en ascii (ignorando errores).

Necesitaba algo como esto, pero para eliminar solo los caracteres acentuados , ignorando los especiales y realicé esta pequeña función:

 # ~*~ coding: utf-8 ~*~ import re def remove_accents(string): if type(string) is not unicode: string = unicode(string, encoding='utf-8') string = re.sub(u"[àáâãäå]", 'a', string) string = re.sub(u"[èéêë]", 'e', string) string = re.sub(u"[ìíîï]", 'i', string) string = re.sub(u"[òóôõö]", 'o', string) string = re.sub(u"[ùúûü]", 'u', string) string = re.sub(u"[ýÿ]", 'y', string) return string 

Me gusta esa función porque puedes personalizarla en caso de que necesites ignorar a otros personajes

La URL dada devuelve UTF-8 como la respuesta HTTP indica claramente:

 wget -S http://dictionary.reference.com/browse/apple?s=t --2013-01-02 08:43:40-- http://dictionary.reference.com/browse/apple?s=t Resolving dictionary.reference.com (dictionary.reference.com)... 23.14.94.26, 23.14.94.11 Connecting to dictionary.reference.com (dictionary.reference.com)|23.14.94.26|:80... connected. HTTP request sent, awaiting response... HTTP/1.1 200 OK Server: Apache Cache-Control: private Content-Type: text/html;charset=UTF-8 Date: Wed, 02 Jan 2013 07:43:40 GMT Transfer-Encoding: chunked Connection: keep-alive Connection: Transfer-Encoding Set-Cookie: sid=UOPlLC7t-zl20-k7; Domain=reference.com; Expires=Wed, 02-Jan-2013 08:13:40 GMT; Path=/ Set-Cookie: cu.wz=0; Domain=.reference.com; Expires=Thu, 02-Jan-2014 07:43:40 GMT; Path=/ Set-Cookie: recsrch=apple; Domain=reference.com; Expires=Tue, 02-Apr-2013 07:43:40 GMT; Path=/ Set-Cookie: dcc=*~*~*~*~*~*~*~*~; Domain=reference.com; Expires=Thu, 02-Jan-2014 07:43:40 GMT; Path=/ Set-Cookie: iv_dic=1-0; Domain=reference.com; Expires=Thu, 03-Jan-2013 07:43:40 GMT; Path=/ Set-Cookie: accepting=1; Domain=.reference.com; Expires=Thu, 02-Jan-2014 07:43:40 GMT; Path=/ Set-Cookie: bid=UOPlLC7t-zlrHXne; Domain=reference.com; Expires=Fri, 02-Jan-2015 07:43:40 GMT; Path=/ Length: unspecified [text/html] 

Investigar el archivo guardado usando vim también revela que los datos están correctamente codificados en utf-8 … lo mismo es cierto al obtener la URL usando Python.