如何使用lxml在特定位置插入文本节点?

时间:2017-05-31 13:37:08

标签: python html lxml

如果tostring(root)类似于:

<root><child1></child1><child2></child2></root>

并且想要在child1之前插入普通文本(甚至可能已经转义过);两个孩子之间;在child2lxml之后,应该如何做到这一点?我问,因为看起来,lxml中没有单独的文本节点,只能访问text的{​​{1}}属性,我找不到任何文本节点API文档中的解决方案......

无论如何,期望的最终结果看起来像这样:

Element

2 个答案:

答案 0 :(得分:1)

要在节点的任何子节点之前插入文本,请使用节点的text属性。

要在节点的子节点之后插入文本,请使用该子节点的tail属性。

from lxml import etree
s = "<root><child1></child1><child2></child2></root>"
root = etree.XML(s)
root.text = "text1"
child1, child2 = root.getchildren()
child1.tail = "text2"
child2.tail = "text3"
print(etree.tostring(root, method="c14n")) #use this method to prevent self-closing tags in output

结果:

b'<root>text1<child1></child1>text2<child2></child2>text3</root>'

答案 1 :(得分:0)

text属性似乎可以完成这项工作。设置它似乎很简单。

test="<root><child1></child1><child2></child2></root>"
from lxml import etree
root = etree.fromstring(test)
etree.tostring(root)
b'<root><child1/><child2/></root>'
print(root.text)
None
root.text = '1'
print(root.text)
1
etree.tostring(root)
b'<root>1<child1/><child2/></root>'
for child in root:
    child.text = 'test'
etree.tostring(root)
b'<root>1<child1>test</child1><child2>test</child2></root>'

现在如果你在元素结束后需要文本,那么你需要元素的tail属性。

for child in root:
    child.text = None
    child.tail = 'tail'