Cómo trabajar con unicode en Python

Estoy tratando de limpiar todo el HTML de una cadena para que la salida final sea un archivo de texto. Tengo un poco de investigación sobre los diversos ‘convertidores’ y estoy empezando a inclinarme hacia la creación de mi propio diccionario para las entidades y los símbolos y ejecutar un reemplazo en la cadena. Estoy considerando esto porque quiero automatizar el proceso y hay mucha variabilidad en la calidad del html subyacente. Para comenzar a comparar la velocidad de mi solución y una de las alternativas, p. Ej., La creación de parámetros, decidí probar la sustitución de \ xa0 utilizando el método de cadena reemplazar. Yo tengo un

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128) 

La actual línea de código era

 s=unicodestring.replace('\xa0','') 

De todos modos, decidí que necesitaba comenzar con una r, así que corrí esta línea de código:

 s=unicodestring.replace(r'\xa0','') 

Se ejecuta sin error, pero cuando miro una porción de s veo que \ xaO todavía está allí

puede ser que deberías estar haciendo

 s=unicodestring.replace(u'\xa0',u'') 
 s=unicodestring.replace('\xa0','') 

… está tratando de crear el carácter Unicode \xa0 , que no es válido en una clasificación ASCII (el tipo de cadena predeterminado en Python hasta la versión 3.x)

La razón por la que r'\xa0' no se ha r'\xa0' error es porque en una cadena sin formato, las secuencias de escape no tienen ningún efecto. En lugar de intentar codificar \xa0 en el carácter Unicode, vio la cadena como una “barra invertida literal”, “x literal” y así sucesivamente …

Los siguientes son los mismos:

 >>> r'\xa0' '\\xa0' >>> '\\xa0' '\\xa0' 

Esto es algo que se resolvió en Python v3, ya que el tipo de cadena predeterminado es Unicode, así que solo puedes hacer …

 >>> '\xa0' '\xa0' 

Estoy tratando de limpiar todo el HTML de una cadena para que el resultado final sea un archivo de texto

Recomendaría encarecidamente BeautifulSoup para esto. Escribir una herramienta de limpieza de HTML es difícil (dado lo horrible que es la mayoría de HTML), y BeautifulSoup hace un gran trabajo al analizar HTML y tratar con Unicode.

 >>> from BeautifulSoup import BeautifulSoup >>> soup = BeautifulSoup("

Hi

") >>> print soup.prettify()

Hi

Mire la biblioteca estándar de códecs , específicamente los métodos de encoding y deencoding provistos en la clase base Codec.

También hay un buen artículo aquí que lo pone todo junto.

En lugar de esto, es mejor usar las funciones estándar de Python.

Por ejemplo:

 string = unicode('Hello, \xa0World', 'utf-8', 'replace') 

o

 string = unicode('Hello, \xa0World', 'utf-8', 'ignore') 

donde replace reemplazará \xa0 a \\xa0 .

Pero si \xa0 realmente no es significativo para usted y desea eliminarlo, entonces use ignore .

Sólo una nota sobre la limpieza de HTML. Es muy muy difícil, ya que

 < body > 

Es una forma válida de escribir HTML. Sólo un fyi.

Puedes convertirlo a Unicode de esta manera:

 print u'Hello, \xa0World' # print Hello, World