Actualmente estoy usando Beautiful Soup para analizar un archivo HTML y llamar 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 forma de eliminar el formato Unicode?
Intenté usar:, line = line.replace(u'\xa0',' ')
como lo sugirió otro hilo, pero eso cambió los \ xa0's a u's, así que ahora tengo "u" s en todas partes. ):
EDITAR: Parece que el problema se resuelve str.replace(u'\xa0', ' ').encode('utf-8')
, pero el hecho de .encode('utf-8')
no hacerlo replace()
hace que escupe caracteres aún más extraños, \ xc2 por ejemplo. ¿Alguien puede explicar esto?
u''
s en lugar de''
s. :-)u' '
reemplazo, no el' '
. ¿Es la cadena original la unicode?Respuestas:
\ xa0 es en realidad un espacio sin interrupciones en Latin1 (ISO 8859-1), también chr (160). Deberías reemplazarlo con un espacio.
string = string.replace(u'\xa0', u' ')
Cuando .encode ('utf-8') codificará el unicode a utf-8, eso 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 sobre http://docs.python.org/howto/unicode.html .
Tenga en cuenta: esta respuesta de 2012, Python ha avanzado, debería poder usarla
unicodedata.normalize
ahorafuente
b'\xa0'
byte en la codificación latin1, como dos bytesb'\xc2\xa0'
en la codificación utf-8. Se puede representar como
en html.UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 397: ordinal not in range(128)
.Hay muchas cosas útiles en la
unicodedata
biblioteca de Python . Uno de ellos es la.normalize()
función.Tratar:
Reemplazar NFKD con cualquiera de los otros métodos enumerados en el enlace anterior si no obtiene los resultados que busca.
fuente
normalize('NFKD', '1º\xa0dia')
devolver '1º dia' pero devuelve '1o dia'unicodedata.normalize
Intente usar .strip () al final de su línea
line.strip()
funcionó bien para mífuente
Después de probar varios métodos, para resumirlo, así es como lo hice. Las siguientes son dos formas de evitar / eliminar caracteres \ xa0 de una cadena HTML analizada.
Supongamos que tenemos nuestro html en bruto de la siguiente manera:
Entonces intentemos limpiar esta cadena HTML:
El código anterior produce estos caracteres \ xa0 en la cadena. Para eliminarlos adecuadamente, 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 tanto, nuestro código se convierte en:
Método # 2: La otra opción es usar unicodedatos de la biblioteca de Python
También he detallado estos métodos en este blog que quizás desee consultar.
fuente
prueba esto:
fuente
len(b'\\xa0') == 4
perolen(b'\xa0') == 1
. Si es posible; deberías arreglar el flujo ascendente que genera estos escapes.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 sí:
line = line.decode('ascii', 'ignore')
Sin embargo, mi objetivo era eliminar los \ xa0s, en lugar de reemplazarlos con espacios.Obtuve esto de este tutorial unicode súper útil de Ned Batchelder.
fuente
'ignore'
es como empujar la palanca de cambios aunque no entiendas cómo funciona el embrague ...str.encode(..., 'ignore')
es el equivalente de manejo Unicode detry: ... except: ...
. Si bien puede ocultar el mensaje de error, rara vez resuelve el problema..decode('ascii', 'ignore')
line.decode()
en su respuesta sugiere que su entrada es una cadena de bytes (no debe llamar.decode()
a una cadena Unicode (para aplicarla, el método se elimina en Python 3). No entiendo cómo es posible ver el tutorial que ha vinculado en su respuesta y se pierda la diferencia entre bytes y Unicode (no mezclarlos).Termino aquí mientras busco en Google el problema con el carácter no imprimible. Yo uso MySQL
UTF-8
general_ci
y trato con el lenguaje polaco. Para cadenas problemáticas, debo proceder de la siguiente manera:Es solo una solución rápida y probablemente debería intentar algo con la configuración de codificación correcta.
fuente
text
es una cadena de bytes que representa un texto codificado usando utf-8. Si está trabajando con texto; decodifíquelo en Unicode primero (.decode('utf-8')
) y codifíquelo en una cadena de bytes solo al final (si la API no es compatible con Unicode directamente, por ejemplosocket
). Todas las operaciones intermedias en el texto deben realizarse en Unicode.Prueba este código
fuente
0xA0 (Unicode) es 0xC2A0 en UTF-8.
.encode('utf8')
solo tomará su Unicode 0xA0 y lo reemplazará con UTF-8's 0xC2A0. De ahí la aparición de 0xC2s ... La codificación no está reemplazando, como probablemente ya se haya dado cuenta ahora.fuente
0xc2a0
es ambiguo (orden de bytes). Utiliceb'\xc2\xa0'
bytes literales en su lugar.Es el equivalente de un personaje espacial, así que quítalo
fuente
En Beautiful Soup, puede pasar
get_text()
el parámetro strip, que elimina 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 resolvió el problema para mí.fuente
strip=True
funciona solo si
está al principio o al final de cada bit de texto. No eliminará el espacio si está entre otros caracteres en el texto.Versión genérica con la expresión regular (eliminará todos los caracteres de control):
fuente
Python lo reconoce como un carácter de espacio, por lo que puede
split
hacerlo sin argumentos y unirse por un espacio en blanco normal:fuente