Вам нужно посмотреть на свойство .tail
, а также .text
: .text
дает вам текст непосредственно после начального тега, .tail
дает вам текст непосредственно после конечного тега. Это предоставит вам ваши "много маленьких строк".
Совет: вы можете использовать etree.iterwalk(elem)
(делает то же самое, что и с etree.iterparse()
, но вместо существующего дерева), чтобы перебирать начальный и конечный теги. На идею:
for event, elem in etree.iterwalk(xml_elem, events=('start', 'end')):
if event == 'start':
# it's a start tag
print 'starting element', elem.tag
print elem.text
elif event == 'end':
# it's an end tag
print 'ending element', elem.tag
if elem is not xml_elem:
# dont' want the text trailing xml_elem
print elem.tail
Я полагаю, вы можете завершить остальное для себя?
Предупреждение: .text
и .tail
могут быть None
, поэтому, если вы хотите объединить, вы должны будете защититься от этого (используйте (elem.text or '')
например)
Если вы знакомы с саксофоном (или имеете существующий саксофон-код, который делает то, что вам нужно), lxml позволяет создавать события саксофона из элемента или дерева :
lxml.sax.saxify(elem, handler)
Некоторые другие вещи, которые нужно искать при извлечении всего текста из элемента: метод .itertext()
, выражение xpath .//text()
(lxml позволяет вам возвращать «умные строки» из выражений xpath: они позволяют вам проверять, какой элемент они принадлежат и т.д ...).