XMLドキュメントを解析したい。だから私は以下のようにXML文書を保存しました
class XMLdocs(db.Expando):
id = db.IntegerProperty()
name=db.StringProperty()
content=db.BlobProperty()
今、私の下は私のコードです
parser = make_parser()
curHandler = BasketBallHandler()
parser.setContentHandler(curHandler)
for q in XMLdocs.all():
parser.parse(StringIO.StringIO(q.content))
エラーが発生しています
'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)
UTF-8バイトオーダーマーク(BOM)にヒットしているようです。 BOMを抽出して、このUnicode文字列を使用してみてください。
import codecs
content = unicode(q.content.strip(codecs.BOM_UTF8), 'utf-8')
parser.parse(StringIO.StringIO(content))
strip
の代わりにlstrip
を使用しました。これは、ファイルの内容が連結されているために、BOMが複数回発生したためです。
この問題に対する実際のベストアンサーは、環境、特に端末が期待するエンコーディングによって異なります。
最速の1行の解決策は、印刷するすべてをASCIIにエンコードすることです。これは、端末が受け入れることはほぼ確実であり、印刷できない文字は破棄します。
print ch #fails
print ch.encode('ascii', 'ignore')
より良い解決策は、端末のエンコードをutf-8に変更し、印刷する前にすべてをutf-8としてエンコードすることです。文字列を印刷または読み取るたびに、Unicodeエンコーディングについて考える習慣を身に付ける必要があります。
オブジェクトの最後に.encode('utf-8')
を置くだけで、最近のバージョンのPythonで仕事ができます。
これは私のために働いた:
from Django.utils.encoding import smart_str
content = smart_str(content)
問題は、ユニコード文字を非ユニコード端末に印刷しようとしていることです。印刷する前に、'replace
オプションでエンコードする必要があります。 print ch.encode(sys.stdout.encoding, 'replace')
。
トレースバックによると、問題はparseXML.py
の136行目のprint
ステートメントです。残念ながら、あなたはあなたのコードのその部分を投稿するのにふさわしくないと思いましたが、デバッグのためだけにあると思います。変更する場合:
print repr(ch)
少なくとも、印刷しようとしているものが表示されるはずです。