u00f3 - unicode escape python
Python: ¿Eliminar / xa0 de la cadena? (10)
0xA0 (Unicode) es 0xC2A0 en UTF-8. .encode(''utf8'')
simplemente tomará su Unicode 0xA0 y lo reemplazará con 0xC2A0 de UTF-8. De ahí la aparición de 0xC2 ... La codificación no está reemplazando, como probablemente ya hayas notado.
Actualmente estoy usando Beautiful Soup para analizar un archivo HTML y llamar a get_text()
, pero parece que me quedan muchos / xa0 Unicode que representan espacios. ¿Hay alguna manera eficiente de eliminarlos en Python 2.7 y cambiarlos a espacios? Supongo que la pregunta más general sería, ¿hay alguna manera de eliminar el formato Unicode?
Intenté usar: line = line.replace(u''/xa0'','' '')
, como lo sugirió otro hilo, pero eso cambió los / xa0''s para ti, así que ahora tengo "u" s en todos lados. )
EDITAR: El problema parece ser resuelto por str.replace(u''/xa0'', '' '').encode(''utf-8'')
, pero simplemente haciendo .encode(''utf-8'')
sin replace()
parece hacer que escupe caracteres aún más extraños, / xc2 por ejemplo. ¿Alguien puede explicar esto?
Después de probar varios métodos, para resumirlo, así es como lo hice. Las siguientes son dos formas de evitar / eliminar los caracteres / xa0 de la cadena HTML analizada.
Supongamos que tenemos nuestro html en bruto de la siguiente manera:
raw_html = ''<p>Dear Parent, </p><p><span style="font-size: 1rem;">This is a test message, </span><span style="font-size: 1rem;">kindly ignore it. </span></p><p><span style="font-size: 1rem;">Thanks</span></p>''
Así que intentemos limpiar esta cadena HTML:
from bs4 import BeautifulSoup
raw_html = ''<p>Dear Parent, </p><p><span style="font-size: 1rem;">This is a test message, </span><span style="font-size: 1rem;">kindly ignore it. </span></p><p><span style="font-size: 1rem;">Thanks</span></p>''
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 correctamente, podemos usar dos formas.
Método n. ° 1 (Recomendado): El primero es el método get_text de BeautifulSoup con el argumento strip como True, por lo que 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 n. ° 2: la otra opción es usar la biblioteca de python unicodedata
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 a los que puede referir.
En Beautiful Soup, puede pasar get_text()
al parámetro strip, que get_text()
el espacio en blanco del principio y el final del texto. Esto eliminará /xa0
o cualquier otro espacio en blanco si ocurre al comienzo 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)
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)
Reemplazar NFKD con cualquiera de los otros métodos enumerados en el enlace anterior si no obtiene los resultados que busca.
Intenta usar .strip () al final de tu 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 hizo: line = line.decode(''ascii'', ''ignore'')
Sin embargo, mi objetivo era eliminar los / xa0s, en lugar de reemplazarlos por espacios.
Lo obtuve de este tutorial Unicode súper útil de Ned Batchelder.
Prueba este código
import re
re.sub(r''[^/x00-/x7F]+'','''',''paste your string here'').decode(''utf-8'',''ignore'').strip()
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, debo proceder de la siguiente manera:
text=text.replace(''/xc2/xa0'', '' '')
Es solo una solución rápida y probablemente deba intentar algo con la configuración de codificación correcta.
/ xa0 es en realidad espacio sin interrupción en Latin1 (ISO 8859-1), también chr (160). Debes reemplazarlo con 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.
prueba esto:
string.replace(''//xa0'', '' '')