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