Me sale un error con el siguiente patrón:
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 155: ordinal not in range(128)
No estoy seguro de qué u'\ufeff'
es, aparece cuando estoy raspando web. ¿Cómo puedo remediar la situación? El .replace()
método de cadena no funciona en él.
Respuestas:
El carácter Unicode
U+FEFF
es la marca de orden de bytes, o BOM, y se usa para diferenciar entre la codificación UTF-16 big y little endian. Si decodifica la página web utilizando el códec correcto, Python lo eliminará por usted. Ejemplos:Tenga en cuenta que
EF BB BF
es una lista de materiales codificada en UTF-8. No es necesario para UTF-8, pero solo sirve como una firma (generalmente en Windows).Salida:
Tenga en cuenta que el
utf-16
códec requiere que BOM esté presente, o Python no sabrá si los datos son big-o little-endian.fuente
Me encontré con esto en Python 3 y encontré esta pregunta (y solución ). Al abrir un archivo, Python 3 admite la palabra clave de codificación para manejar automáticamente la codificación.
Sin ella, la lista de materiales se incluye en el resultado de lectura:
Dando la codificación correcta, la lista de materiales se omite en el resultado:
Solo mis 2 centavos.
fuente
Ese personaje es la lista de materiales o "marca de orden de bytes". Por lo general, se recibe como los primeros bytes de un archivo y le indica cómo interpretar la codificación del resto de los datos. Simplemente puede eliminar el personaje para continuar. Sin embargo, dado que el error dice que estaba tratando de convertir a 'ascii', probablemente debería elegir otra codificación para lo que estaba tratando de hacer.
fuente
El contenido que está raspando está codificado en unicode en lugar de texto ascii, y está obteniendo un carácter que no se convierte en ascii. La "traducción" correcta depende de lo que la página web original pensara que era. La página Unicode de Python ofrece información general sobre cómo funciona.
¿Estás intentando imprimir el resultado o pegarlo en un archivo? El error sugiere que es escribir los datos que están causando el problema, no leerlos. Esta pregunta es un buen lugar para buscar las soluciones.
fuente
Aquí se basa en la respuesta de Mark Tolonen. La cadena incluía diferentes idiomas de la palabra 'prueba' que está separada por '|', para que pueda ver la diferencia.
Aquí hay una prueba de funcionamiento:
Vale la pena saber que solo ambos
utf-8-sig
yutf-16
recuperar la cadena original después de ambosencode
ydecode
.fuente
Este problema surge básicamente cuando guarda su código de Python en una codificación UTF-8 o UTF-16 porque Python agrega automáticamente un carácter especial al comienzo del código (que los editores de texto no muestran) para identificar el formato de codificación. Pero, cuando intenta ejecutar el código, le da el error de sintaxis en la línea 1, es decir, el inicio del código porque el compilador de Python entiende la codificación ASCII . cuando ve el código del archivo usando la función read () , puede ver al comienzo del código devuelto que se muestra '\ ufeff' . La solución más simple para este problema es simplemente cambiando la codificación de nuevo a la codificación ASCII(para esto, puede copiar su código en un bloc de notas y guardarlo ¡Recuerde! elija la codificación ASCII ... Espero que esto ayude.
fuente