Анализатор SAX в Python 2.6 должен быть способен анализировать utf-8 без искажения. Хотя вы не учли ContentHandler, который вы используете с парсером, если этот обработчик содержимого пытается напечатать любые символы не-ascii на вашей консоли, это приведет к сбою.
Например, у меня есть этот XML-документ:
<?xml version="1.0" encoding="utf-8"?>
<test>
<name>Champs-Élysées</name>
</test>
И этот парсинг аппарат:
import xml.sax
class MyHandler(xml.sax.handler.ContentHandler):
def startElement(self, name, attrs):
print "StartElement: %s" % name
def endElement(self, name):
print "EndElement: %s" % name
def characters(self, ch):
#print "Characters: '%s'" % ch
pass
parser = xml.sax.make_parser()
parser.setContentHandler(MyHandler())
for line in open('text.xml', 'r'):
parser.feed(line)
Это разбирает просто прекрасно, и содержание действительно сохранит акцентированные символы в XML. Единственная проблема - это строка в def characters()
, которую я прокомментировал. Запустив консоль в Python 2.6, это создаст исключение, которое вы видите, потому что функция печати должна преобразовывать символы в ascii для вывода.
У вас есть 3 возможных решения:
One: Убедитесь, что ваш терминал поддерживает Юникод, а затем создать sitecustomize.py
запись в вашем site-packages
и установить набор символов по умолчанию в UTF-8:
импорт SYS sys.setdefaultencoding ('UTF-8')
Два: не печатает вывод на терминал (неискренний)
Три: Нормализация вывод, используя unicodedata.normalize
для преобразования не-ASCII символы в кодировке ASCII эквиваленты или encode
в гольцов в ASCII для вывода текста: ch.encode('ascii', 'replace')
. Конечно, используя этот метод, вы не сможете правильно оценить текст.
Используя один вариант выше, ваш код работал отлично для моего в Python 2.5.
Это работало в 2.5, тоже. –