Tengo una cadena que se parece a eso:
6Â 918Â 417Â 712
La forma clara de recortar esta cadena (como entiendo Python) es simplemente decir que la cadena está en una variable llamada s
, obtenemos:
s.replace('Â ', '')
Eso debería hacer el truco. Pero, por supuesto, se queja de que el carácter no ASCII del '\xc2'
archivo blabla.py no está codificado.
Nunca pude entender cómo cambiar entre diferentes codificaciones.
Aquí está el código, realmente es el mismo que el anterior, pero ahora está en contexto. El archivo se guarda como UTF-8 en el bloc de notas y tiene el siguiente encabezado:
#!/usr/bin/python2.4
# -*- coding: utf-8 -*-
El código:
f = urllib.urlopen(url)
soup = BeautifulSoup(f)
s = soup.find('div', {'id':'main_count'})
#making a print 's' here goes well. it shows 6Â 918Â 417Â 712
s.replace('Â ','')
save_main_count(s)
No llega más allá de s.replace
...
u
Respuestas:
Python 2 utiliza
ascii
como codificación predeterminada para los archivos de origen, lo que significa que debe especificar otra codificación en la parte superior del archivo para usar caracteres Unicode que no sean ASCII en literales. Python 3 se utilizautf-8
como codificación predeterminada para los archivos de origen, por lo que esto es un problema menor.Ver: http://docs.python.org/tutorial/interpreter.html#source-code-encoding
Para habilitar la codificación de origen utf-8, esto iría en una de las dos líneas superiores:
Lo anterior está en los documentos, pero esto también funciona:
Consideraciones adicionales:
El archivo de origen también debe guardarse utilizando la codificación correcta en su editor de texto.
En Python 2, el literal Unicode debe tener un
u
antes, como ens.replace(u"Â ", u"")
Pero en Python 3, solo use comillas. En Python 2, puedefrom __future__ import unicode_literals
obtener el comportamiento de Python 3, pero tenga en cuenta que esto afecta a todo el módulo actual.s.replace(u"Â ", u"")
también fallará sis
no es una cadena Unicode.string.replace
devuelve una nueva cadena y no se edita en su lugar, así que asegúrese de usar el valor de retorno tambiénfuente
# coding: utf-8
.-*-
no es para decoración, pero es poco probable que lo necesite. Creo que estaba ahí para viejas conchas.editar: mi primer impulso es siempre usar un filtro, pero la expresión del generador es más eficiente en memoria (y más corta) ...
Tenga en cuenta que se garantiza que esto funciona con la codificación UTF-8 (porque todos los bytes en caracteres multibyte tienen el bit más alto establecido en 1).
fuente
u
si es un literal.fuente
El siguiente código reemplazará todos los caracteres no ASCII con signos de interrogación.
fuente
Usando Regex:
fuente
Demasiado tarde para una respuesta, pero la cadena original estaba en UTF-8 y '\ xc2 \ xa0' es UTF-8 para NO-BREAK SPACE. Simplemente decodifique la cadena original como
s.decode('utf-8')
(\ xa0 se muestra como un espacio cuando se decodifica incorrectamente como Windows-1252 o latin-1:Ejemplo (Python 3)
Salida
fuente
Esto se imprimirá
6 918 417 712
fuente
Sé que es un hilo antiguo, pero me sentí obligado a mencionar el método de traducción, que siempre es una buena manera de reemplazar todos los códigos de caracteres por encima de 128 (u otro si es necesario).
Uso : str. traducir ( tabla [, eliminar caracteres] )
A partir de Python 2.6 , también puede establecer la tabla en Ninguno y usar deletechars para eliminar los caracteres que no desea, como en los ejemplos que se muestran en los documentos estándar en http://docs.python.org/library/stdtypes. html .
Con cadenas Unicode, la tabla de traducción no es una cadena de 256 caracteres sino un dict con el ord () de los caracteres relevantes como claves. Pero de todos modos, obtener una cadena ascii adecuada de una cadena unicode es bastante simple, usando el método mencionado por truppo anteriormente, a saber: unicode_string.encode ("ascii", "ignore")
Como resumen, si por alguna razón es absolutamente necesario obtener una cadena ascii (por ejemplo, cuando genera una excepción estándar con
raise Exception, ascii_message
), puede usar la siguiente función:Lo bueno de translate es que puedes convertir caracteres acentuados en caracteres ascii relevantes sin acentos en lugar de simplemente eliminarlos o reemplazarlos por '?'. Esto suele ser útil, por ejemplo, para fines de indexación.
fuente
y haga que su
.py
archivo sea unicode.fuente
Este es un truco sucio, pero puede funcionar.
fuente
Por lo que valía, mi juego de caracteres era
utf-8
y había incluido la# -*- coding: utf-8 -*-
línea clásica " ".Sin embargo, descubrí que no tenía Universal Newlines al leer estos datos de una página web.
Mi texto tenía dos palabras, separadas por "
\r\n
". Solo estaba dividiendo\n
y reemplazando el"\n"
.Una vez que recorrí y vi el juego de caracteres en cuestión, me di cuenta del error.
Entonces, también podría estar dentro del conjunto de caracteres ASCII , pero un carácter que no esperabas.
fuente