u ‘\ ufeff’ en la cadena Python

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é es u'\ufeff' , aparece cuando estoy raspando web. ¿Cómo puedo remediar la situación? El método de cadena .replace() no funciona en él.

El carácter Unicode U+FEFF es la marca de orden de bytes, o BOM, y se utiliza para indicar la diferencia entre la encoding UTF-16 de big-little y little-endian. Si descodifica la página web con el códec correcto, Python la eliminará por usted. Ejemplos:

 #!python2 #coding: utf8 u = u'ABC' e8 = u.encode('utf-8') # encode without BOM e8s = u.encode('utf-8-sig') # encode with BOM e16 = u.encode('utf-16') # encode with BOM e16le = u.encode('utf-16le') # encode without BOM e16be = u.encode('utf-16be') # encode without BOM print 'utf-8 %r' % e8 print 'utf-8-sig %r' % e8s print 'utf-16 %r' % e16 print 'utf-16le %r' % e16le print 'utf-16be %r' % e16be print print 'utf-8 w/ BOM decoded with utf-8 %r' % e8s.decode('utf-8') print 'utf-8 w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig') print 'utf-16 w/ BOM decoded with utf-16 %r' % e16.decode('utf-16') print 'utf-16 w/ BOM decoded with utf-16le %r' % e16.decode('utf-16le') 

Tenga en cuenta que EF BB BF es una lista de materiales codificada en UTF-8. No se requiere para UTF-8, pero sirve solo como una firma (generalmente en Windows).

Salida:

 utf-8 'ABC' utf-8-sig '\xef\xbb\xbfABC' utf-16 '\xff\xfeA\x00B\x00C\x00' # Adds BOM and encodes using native processor endian-ness. utf-16le 'A\x00B\x00C\x00' utf-16be '\x00A\x00B\x00C' utf-8 w/ BOM decoded with utf-8 u'\ufeffABC' # doesn't remove BOM if present. utf-8 w/ BOM decoded with utf-8-sig u'ABC' # removes BOM if present. utf-16 w/ BOM decoded with utf-16 u'ABC' # *requires* BOM to be present. utf-16 w/ BOM decoded with utf-16le u'\ufeffABC' # doesn't remove BOM if present. 

Tenga en cuenta que el códec utf-16 requiere que la lista de materiales esté presente, o Python no sabrá si los datos son grandes o pequeños.

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 encoding para manejar automáticamente la encoding.

Sin ella, la lista de materiales se incluye en el resultado de lectura:

 >>> f = open('file', mode='r') >>> f.read() '\ufefftest' 

Al proporcionar la encoding correcta, la lista de materiales se omite en el resultado:

 >>> f = open('file', mode='r', encoding='utf-8-sig') >>> f.read() 'test' 

Sólo mis 2 centavos.

Ese carácter es la lista de materiales o la “Marca de orden de bytes”. Normalmente se recibe como los primeros bytes de un archivo, que le indica cómo interpretar la encoding del rest de los datos. Simplemente puede eliminar el personaje para continuar. Aunque, como el error dice que intentabas convertir a ‘ascii’, probablemente deberías elegir otra encoding para lo que sea que estabas intentando hacer.

El contenido que está raspando está codificado en Unicode en lugar de texto ASCII, y está obteniendo un carácter que no se convierte a ASCII. La ‘traducción’ correcta depende de lo que la página web original pensó que era. La página Unicode de Python proporciona información 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 correcciones.

Este problema surge básicamente cuando guarda su código de Python en una encoding UTF-8 o UTF-16 porque Python agrega algunos caracteres especiales al principio del código automáticamente (lo cual no se muestra en los editores de texto) para identificar el formato de encoding. Pero, cuando intenta ejecutar el código, aparece el error de syntax en la línea 1, es decir, el inicio del código porque el comstackdor de Python entiende la encoding ASCII . cuando ve el código del archivo usando la función read () , puede ver que al principio del código devuelto se muestra ‘\ ufeff’ . La solución más sencilla a este problema es simplemente cambiando la encoding a la encoding ASCII (para esto puede copiar su código en un bloc de notas y guardarlo. Recuerde: elija la encoding ASCII … Espero que esto le ayude.