web-dev-qa-db-fra.com

UnicodeEncodeError: le codec 'ascii' ne peut pas coder le caractère u '\ xef' en position 0: l'ordinal n'est pas dans la plage (128)

Je veux analyser mon document XML. J'ai donc stocké mon document XML comme ci-dessous

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

Maintenant mon ci-dessous est mon code

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

J'obtiens une erreur

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

Il semble que vous frappiez une marque d'ordre d'octet (BOM) UTF-8. Essayez d’utiliser cette chaîne unicode avec la nomenclature extraite:

import codecs

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

J'ai utilisé strip au lieu de lstrip parce que dans votre cas, vous aviez plusieurs occurrences de nomenclature, probablement en raison du contenu concaténé du fichier.

30
Tugrul Ates

La meilleure réponse à ce problème dépend de votre environnement, en particulier de l’encodage attendu par votre terminal.

La solution la plus rapide sur une ligne consiste à coder tout ce que vous imprimez en ASCII, ce que votre terminal est quasiment certain d'accepter, tout en supprimant les caractères que vous ne pouvez pas imprimer:

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

La meilleure solution consiste à modifier le codage de votre terminal en utf-8 et à tout encoder en tant que utf-8 avant impression. Vous devriez prendre l’habitude de penser à votre codage Unicode CHAQUE fois que vous imprimez ou lisez une chaîne.

112
Triptych

Il suffit de mettre .encode('utf-8') à la fin de l’objet pour effectuer le travail dans les versions récentes de Python.

56
Nicole

Cela a fonctionné pour moi:

from Django.utils.encoding import smart_str
content = smart_str(content)
30
Orlando Pozo

Le problème est que vous essayez d'imprimer un caractère Unicode sur un terminal éventuellement non-Unicode. Vous devez l’encoder avec l’option 'replace Avant de l’imprimer, par exemple. print ch.encode(sys.stdout.encoding, 'replace').

7
Rosh Oxymoron

Le problème selon votre traçage est l’instruction print de la ligne 136 de parseXML.py. Malheureusement, vous n'avez pas jugé bon de publier cette partie de votre code, mais je suppose que ce n'est que pour le débogage. Si vous le changez en:

print repr(ch)

alors vous devriez au moins voir ce que vous essayez d’imprimer.

7
Duncan