Определение stringify_children
этот способ может быть менее сложным:
from lxml import etree
def stringify_children(node):
s = node.text
if s is None:
s = ''
for child in node:
s += etree.tostring(child, encoding='unicode')
return s
или в одну строку
return (node.text if node.text is not None else '') + ''.join((etree.tostring(child, encoding='unicode') for child in node))
Обоснование такое же, как в этот ответ : оставьте сериализацию дочерних узлов в lxml.tail
часть node
в этом случае не интересна, так как находится «за» конечным тегом.Обратите внимание, что аргумент encoding
может быть изменен в соответствии с вашими потребностями.
Другое возможное решение - сериализация самого узла, а затем удаление начального и конечного тега:
def stringify_children(node):
s = etree.tostring(node, encoding='unicode', with_tail=False)
return s[s.index(node.tag) + 1 + len(node.tag): s.rindex(node.tag) - 2]
что несколько ужасноЭтот код верен, только если node
не имеет атрибутов, и я не думаю, что кто-то захочет использовать его даже тогда.