Форум сайта python.su
Всем привет.
Никак не получается обработать xml файл из-за возникающей ошибки.
В xml-файле встречается “ &thetas; ”, и на ней парсер ломается.
import sys
import xml.etree.ElementTree as eTree
for ev, el in eTree.iterparse(sys.stdin):
print ev,el
Работа:
…
end <Element P at 8104eec>
end <Element P at 8104f4c>
end <Element P at 8104fac>
Traceback (most recent call last):
File “./etr-analyze.py”, line 11, in <module>
for ev, el in eTree.iterparse(sys.stdin):
File “/usr/lib/python2.5/xml/etree/ElementTree.py”, line 937, in next
self._parser.feed(data)
File “/usr/lib/python2.5/xml/etree/ElementTree.py”, line 1245, in feed
self._parser.Parse(data, 0)
xml.parsers.expat.ExpatError: undefined entity: line 1, column 14191
Пробовал сделать обработку через SAX, minidom, pulldom, elementtree , но так и не нашел, как сказать парсеру добавить эту энтити в список известных, превратить в текст или игнорировать вообще. Второй день на сайтах роюсь - не могу найти информацию. Помогите, пожалуйста. Буду рад ответу под любой парсер из перечисленных.
Офлайн
мммм…. может так:
import xml.sax.saxutils
....
xml.sax.saxutils.unescape( data, {'&thetas;':'sho za shtuka?'})
....
Офлайн
Я правда с XML совсем плохо дружу, но вроде по хорошему разные там левые ентити должны быть прописаны в DTD.
Поправьте меня, если я не прав.
Офлайн
1. Что такое data здесь? Строка?
При обработке параграфа, такое впечатление, что сначала параграф обрабатывается до thetas, а thetas обрабатывается на следующей итерации как элемент другого рода. Т.е. в виде строки entity не появляется. Да и смешивать SAX с DOM-парсерами как-то не очень…
2. Передаю элемент внутри цикла: Нет метода replace
Traceback (most recent call last):
File “./etr-analyze.py”, line 16, in <module>
xml.sax.saxutils.unescape(el, {'&thetas;': ‘byaka’})
File “/usr/lib/python2.5/site-packages/_xmlplus/sax/saxutils.py”, line 45, in unescape
data = data.replace(“<”, “<”)
AttributeError: _ElementInterface instance has no attribute ‘replace’
3. Да, в DTD обычно прописываются. Но у тысяч файлов, ждущих обработки, внутри они не прописаны. Как передать парсеру этот параметр DTD из python?
Отредактировано (Авг. 22, 2008 14:23:28)
Офлайн
Есть еще один стандартный парсер:
xml.parsers.expat
он не валидирующий - ему на DTD положить, и поэтому в нем есть разные Entity обработчики.
Отредактировано (Авг. 22, 2008 14:27:58)
Офлайн
data - да, это строка. Перед тем как попадает в парсер =)
Отредактировано (Авг. 22, 2008 14:26:36)
Офлайн
shizaОн-то и выдал ошибку: xml.parsers.expat.ExpatError
Есть еще один стандартный парсер:
xml.parsers.expat
он не валидирующий, и в нем есть разные Entity обработчики.
Офлайн
shizaИ где в коде ее нужно поставить? Ума не приложу.
data - да, это строка. Перед тем как попадает в парсер =)
Отредактировано (Авг. 22, 2008 14:32:22)
Офлайн
ilyayЕсть в sax - метод - setDTDHandler
3. Да, в DTD обычно прописываются. Но у тысяч файлов, ждущих обработки, внутри они не прописаны. Как передать парсеру этот параметр DTD из python?
Офлайн
ilyayЧитаем строку, делаем замену, передаем в парсер, если он может работать с потоком.shizaИ где в коде ее нужно поставить? Ума не приложу.
data - да, это строка. Перед тем как попадает в парсер =)
Или это парсинг за 2 прохода?
Офлайн