Это действительно очень неловкая особенность ElementTree. Суть заключается в следующем: если элемент содержит как текстовые, так и дочерние элементы, и если дочерний элемент находится между различными промежуточными текстовыми узлами, то текст после дочернего элемента называется tail
этого элемента вместо text
. * 1003. *
Чтобы собрать весь текст, который является непосредственным потомком или потомком элемента, вам необходимо получить доступ к text
и tail
этого элемента и всех элементов-потомков.
>>> from lxml import etree
>>> s = '<p>This is the start of parent tag...<ref type="chlid1">child 1</ref>. blah1 blah1 blah1 <ref type="chlid2">child2</ref> blah2 blah2 blah2 </p>'
>>> root = etree.fromstring(s)
>>> child1, child2 = root.getchildren()
>>> root.text
'This is the start of parent tag...'
>>> child1.text, child1.tail
('child 1', '. blah1 blah1 blah1 ')
>>> child2.text, child2.tail
('child2', ' blah2 blah2 blah2 ')
Что касается законченного решения, я обнаружил, что этот ответ делает что-то очень похожее, что вы можете легко приспособиться к своему сценарию использования (не печатая названия элементов).
Редактировать : на самом деле, на мой взгляд, самое простое решение - - использовать itertext :
>>> ''.join(root.itertext())
'This is the start of parent tag...child 1. blah1 blah1 blah1 child2 blah2 blah2 blah2 '