UnicodeEncodeError: el codec ‘ascii’ no puede codificar el carácter u ‘\ xef’ en la posición 0: ordinal no está en el rango (128)

Quiero analizar mi documento XML. Así que he almacenado mi documento XML como abajo

class XMLdocs(db.Expando): id = db.IntegerProperty() name=db.StringProperty() content=db.BlobProperty() 

Ahora mi siguiente es mi código

 parser = make_parser() curHandler = BasketBallHandler() parser.setContentHandler(curHandler) for q in XMLdocs.all(): parser.parse(StringIO.StringIO(q.content)) 

Me estoy poniendo por debajo del error

 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128) Traceback (most recent call last): File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 517, in __call__ handler.post(*groups) File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/base_handler.py", line 59, in post self.handle() File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/handlers.py", line 168, in handle scan_aborted = not self.process_entity(entity, ctx) File "/base/data/home/apps/parsepython/1.348669006354245654/mapreduce/handlers.py", line 233, in process_entity handler(entity) File "/base/data/home/apps/parsepython/1.348669006354245654/parseXML.py", line 71, in process parser.parse(StringIO.StringIO(q.content)) File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/expatreader.py", line 107, in parse xmlreader.IncrementalParser.parse(self, source) File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/xmlreader.py", line 123, in parse self.feed(buffer) File "/base/python_runtime/python_dist/lib/python2.5/xml/sax/expatreader.py", line 207, in feed self._parser.Parse(data, isFinal) File "/base/data/home/apps/parsepython/1.348669006354245654/parseXML.py", line 136, in characters print ch UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128) 

Parece que está alcanzando una marca de orden de bytes UTF-8 (BOM). Intente usar esta cadena Unicode con BOM extraída:

 import codecs content = unicode(q.content.strip(codecs.BOM_UTF8), 'utf-8') parser.parse(StringIO.StringIO(content)) 

Utilicé strip lugar de lstrip porque en su caso tuvo varias apariciones de BOM, posiblemente debido a los contenidos de los archivos concatenados.

La mejor respuesta real para este problema depende de su entorno, específicamente de lo que espera la encoding de su terminal.

La solución de una línea más rápida es codificar todo lo que imprime en ASCII, que es casi seguro que su terminal acepte, mientras descarta los caracteres que no puede imprimir:

 print ch #fails print ch.encode('ascii', 'ignore') 

La mejor solución es cambiar la encoding de su terminal a utf-8, y codificar todo como utf-8 antes de imprimir. Debería acostumbrarse a pensar en la encoding de Unicode CADA vez que imprima o lea una cadena.

Simplemente poniendo .encode('utf-8') al final del objeto hará el trabajo en versiones recientes de Python.

Esto funcionó para mí:

 from django.utils.encoding import smart_str content = smart_str(content) 

El problema según su rastreo es la statement de print en la línea 136 de parseXML.py . Desafortunadamente, no consideraste adecuado publicar esa parte de tu código, pero voy a adivinar que solo está ahí para la depuración. Si lo cambias a:

 print repr(ch) 

entonces al menos debería ver lo que está intentando imprimir.

El problema es que está intentando imprimir un carácter Unicode en un terminal posiblemente no Unicode. print ch.encode(sys.stdout.encoding, 'replace') codificarlo con la opción 'replace antes de imprimirlo, por ejemplo, print ch.encode(sys.stdout.encoding, 'replace') .

Una solución fácil para superar este problema es configurar su encoding predeterminada en utf8. Seguir es un ejemplo.

 import sys reload(sys) sys.setdefaultencoding('utf8')