Python: ¿Eliminando \ xa0 de la cadena?

Actualmente estoy usando Beautiful Soup para analizar un archivo HTML y llamar a get_text() , pero parece que me están quedando muchos \ xa0 Unicode que representan espacios. ¿Hay una forma eficiente de eliminarlos todos en Python 2.7 y cambiarlos a espacios? Supongo que la pregunta más general sería: ¿hay alguna forma de eliminar el formato Unicode?

Intenté usar: line = line.replace(u'\xa0',' ') , como lo sugiere otro hilo, pero eso cambió los \ xa0’s a u’s, así que ahora tengo “u” en todas partes. ):

EDITAR: El problema parece ser resuelto por str.replace(u'\xa0', ' ').encode('utf-8') , pero solo hacer .encode('utf-8') sin replace() parece provocará que escupa incluso caracteres más extraños, \ xc2 por ejemplo. ¿Alguien puede explicar esto?

\ xa0 es en realidad un espacio sin interrupciones en Latin1 (ISO 8859-1), también chr (160). Deberías reemplazarlo por un espacio.

string = string.replace(u'\xa0', u' ')

Cuando .encode (‘utf-8’), codificará el unicode a utf-8, lo que significa que cada unicode podría estar representado por 1 a 4 bytes. Para este caso, \ xa0 está representado por 2 bytes \ xc2 \ xa0.

Lea en http://docs.python.org/howto/unicode.html .

Hay muchas cosas útiles en la biblioteca unicodedata de Python. Uno de ellos es la función .normalize() .

Tratar:

 new_str = unicodedata.normalize("NFKD", unicode_str) 

Reemplace la NFKD con cualquiera de los otros métodos enumerados en el enlace anterior si no obtiene los resultados que está buscando.

Intente usar .strip () al final de su línea line.strip() funcionó bien para mí

Me encontré con este mismo problema al extraer algunos datos de una base de datos sqlite3 con python. Las respuestas anteriores no funcionaron para mí (no estoy seguro de por qué), pero esto sí: line = line.decode('ascii', 'ignore') Sin embargo, mi objective era eliminar los \ xa0s, en lugar de reemplazarlos con espacios.

Obtuve esto de este súper útil tutorial de Unicode por Ned Batchelder.

prueba esto:

 string.replace('\\xa0', ' ') 

Termino aquí mientras busco en Google el problema con el carácter no imprimible. Uso MySQL UTF-8 general_ci y trato con el lenguaje polaco. Para cadenas problemáticas tengo que proceder de la siguiente manera:

 text=text.replace('\xc2\xa0', ' ') 

Es solo una solución rápida y probablemente deberías intentar algo con la configuración de encoding correcta.

Prueba este codigo

 import re re.sub(r'[^\x00-\x7F]+','','paste your string here').decode('utf-8','ignore').strip() 

Después de probar varios métodos, para resumirlo, así es como lo hice. Las siguientes son dos formas de evitar / eliminar \ xa0 caracteres de la cadena HTML analizada.

Supongamos que tenemos nuestro html en bruto de la siguiente manera:

 raw_html = '

Dear Parent,

This is a test message, kindly ignore it.

Thanks

'

Así que tratemos de limpiar esta cadena HTML:

 from bs4 import BeautifulSoup raw_html = '

Dear Parent,

This is a test message, kindly ignore it.

Thanks

' text_string = BeautifulSoup(raw_html, "lxml").text print text_string #u'Dear Parent,\xa0This is a test message,\xa0kindly ignore it.\xa0Thanks'

El código anterior produce estos caracteres \ xa0 en la cadena. Para eliminarlos adecuadamente, podemos usar dos formas.

Método # 1 (recomendado): el primero es el método get_text de BeautifulSoup con el argumento de tira como Verdadero, nuestro código se convierte en:

 clean_text = BeautifulSoup(raw_html, "lxml").get_text(strip=True) print clean_text # Dear Parent,This is a test message,kindly ignore it.Thanks 

Método # 2: La otra opción es usar unicodedata de la biblioteca de python

 import unicodedata text_string = BeautifulSoup(raw_html, "lxml").text clean_text = unicodedata.normalize("NFKD",text_string) print clean_text # u'Dear Parent,This is a test message,kindly ignore it.Thanks' 

También he detallado estos métodos en este blog que tal vez quiera consultar.

0xA0 (Unicode) es 0xC2A0 en UTF-8. .encode('utf8') solo tomará su Unicode 0xA0 y lo reemplazará con el 0xC2A0 de UTF-8. Por lo tanto, la aparición de 0xC2s … La encoding no está reemplazando, como probablemente se habrá dado cuenta ahora.

En Beautiful Soup, puede pasar get_text() el parámetro de tira, que get_text() el espacio en blanco desde el principio y el final del texto. Esto eliminará \xa0 o cualquier otro espacio en blanco si ocurre al principio o al final de la cadena. Beautiful Soup reemplazó una cadena vacía con \xa0 y esto me solucionó el problema.

 mytext = soup.get_text(strip=True) 

Versión genérica con la expresión regular (eliminará todos los caracteres de control):

 import re def remove_control_chart(s): return re.sub(r'\\x..', '', s) 

Es el equivalente de un personaje espacial, así que quítalo.

 print(string.strip()) # no more xa0