standard google engine deploy appengine app python google-app-engine xml-parsing

python - google - UnicodeEncodeError: el códec ''ascii'' no puede codificar el carácter u ''/ xef'' en la posición 0: ordinal no está en el rango(128)



google app engine java (7)

Quiero analizar mi documento XML. Así que he almacenado mi documento XML como se muestra a continuación

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))

Estoy obteniendo el error debajo

''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)


El problema es que estás tratando de 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'') .


El problema según su traceback es la declaración de print en la línea 136 de parseXML.py . Desafortunadamente, no creyó oportuno publicar esa parte de su código, pero supongo que solo está ahí para la depuración. Si lo cambias a:

print repr(ch)

entonces al menos deberías ver lo que estás tratando de imprimir.


Esto funcionó para mí:

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


La mejor respuesta real para este problema depende de su entorno, específicamente qué codificación espera su terminal.

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

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

La mejor solución es cambiar la codificación de su terminal a utf-8 y codificar todo como utf-8 antes de imprimir. Deberías acostumbrarte a pensar sobre tu codificación Unicode CADA vez que imprimas o leas una cadena.


Parece que está presionando una marca de orden de byte 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 múltiples ocurrencias de BOM, posiblemente debido a contenido de archivos concatenados.


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


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

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