Ich möchte mein XML-Dokument analysieren. Daher habe ich mein XML-Dokument wie folgt gespeichert
class XMLdocs(db.Expando):
id = db.IntegerProperty()
name=db.StringProperty()
content=db.BlobProperty()
Jetzt ist mein unten mein Code
parser = make_parser()
curHandler = BasketBallHandler()
parser.setContentHandler(curHandler)
for q in XMLdocs.all():
parser.parse(StringIO.StringIO(q.content))
Ich erhalte unter Fehler
'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)
python
google-app-engine
xml-parsing
Mahesh
quelle
quelle
print
. Verwenden Sie print nicht in einer WSGI-App!Antworten:
Es scheint, dass Sie eine UTF-8-Byte-Bestellmarke (BOM) treffen. Versuchen Sie, diese Unicode-Zeichenfolge mit extrahierter Stückliste zu verwenden:
import codecs content = unicode(q.content.strip(codecs.BOM_UTF8), 'utf-8') parser.parse(StringIO.StringIO(content))
Ich habe
strip
anstelle von verwendet,lstrip
weil in Ihrem Fall mehrere Stücklisten aufgetreten sind, möglicherweise aufgrund von verketteten Dateiinhalten.quelle
s
der den Fehler mit erzeugts = unicode(s.strip(codecs.BOM_UTF8), 'utf-8')
.s
bezieht sich auf den Namen Ihrer Zeichenfolgen.lstrip
mitstrip
.Die beste Antwort auf dieses Problem hängt von Ihrer Umgebung ab, insbesondere davon, welche Codierung Ihr Terminal erwartet.
Die schnellste einzeilige Lösung besteht darin, alles, was Sie drucken, in ASCII zu codieren, was Ihr Terminal mit ziemlicher Sicherheit akzeptiert, und Zeichen zu verwerfen, die Sie nicht drucken können:
print ch #fails print ch.encode('ascii', 'ignore')
Die bessere Lösung besteht darin, die Codierung Ihres Terminals in utf-8 zu ändern und vor dem Drucken alles als utf-8 zu codieren. Sie sollten es sich zur Gewohnheit machen, jedes Mal, wenn Sie eine Zeichenfolge drucken oder lesen, über Ihre Unicode-Codierung nachzudenken.
quelle
Nur
.encode('utf-8')
am Ende des Objekts zu setzen, erledigt den Job in neueren Versionen von Python.quelle
3.x
oder auch2.7
?Das hat bei mir funktioniert:
from django.utils.encoding import smart_str content = smart_str(content)
quelle
Das Problem gemäß Ihrem Traceback ist die
print
Aussage in Zeile 136 vonparseXML.py
. Leider haben Sie es nicht für angebracht gehalten, diesen Teil Ihres Codes zu veröffentlichen, aber ich gehe davon aus, dass er nur zum Debuggen da ist. Wenn Sie es ändern zu:print repr(ch)
dann sollten Sie zumindest sehen, was Sie drucken möchten.
quelle
Das Problem ist, dass Sie versuchen, ein Unicode-Zeichen auf ein möglicherweise nicht Unicode-Terminal zu drucken. Sie müssen es mit der
'replace
Option codieren, bevor Sie es drucken, zprint ch.encode(sys.stdout.encoding, 'replace')
.quelle
Eine einfache Lösung, um dieses Problem zu beheben, besteht darin, die Standardcodierung auf utf8 festzulegen. Folgen ist ein Beispiel
import sys reload(sys) sys.setdefaultencoding('utf8')
quelle
ascii
bleibt. Deshalbsetdefaultencoding
ist es normalerweise nicht ohne denreload
Trick verfügbar .