Проблему «пропущенный конец файла в некоторой точке arbirtrary» трудно объяснить без полного воспроизводимого примера.
Но я подозреваю, что то, что вы называете «кучей дерьма», CDATA разделы .У вас есть несколько таких в вашем примере (кстати, это не один правильно сформированный XML-документ).
Как правило, синтаксический анализатор XML не обязан сохранять разделы CDATA без изменений.Такая разметка, как
<Answer><![CDATA[confirm]]></Answer>
эквивалентна
<Answer>confirm</Answer>
Однако класс lxml.etree.XMLParser
принимает параметр strip_cdata
, который можно использовать для сохранения CDATAразделы.Экземпляр синтаксического анализатора может быть передан в etree.fromstring()
.Вот пример:
from lxml import etree
XML = '<QuestionIndex Id="Perm"><Answer><![CDATA[confirm]]></Answer></QuestionIndex>'
print "Original size:", len(XML)
tree1 = etree.fromstring(XML)
out = etree.tostring(tree1)
print "With CDATA stripped:", len(out)
print out
parser = etree.XMLParser(strip_cdata=False)
tree2 = etree.fromstring(XML, parser)
out = etree.tostring(tree2)
print "With CDATA kept:", len(out)
print out
=>
Original size: 77
With CDATA stripped: 65
<QuestionIndex Id="Perm"><Answer>confirm</Answer></QuestionIndex>
With CDATA kept: 77
<QuestionIndex Id="Perm"><Answer><![CDATA[confirm]]></Answer></QuestionIndex>