如果tostring(root)
类似于:
<root><child1></child1><child2></child2></root>
并且想要在child1
之前插入普通文本(甚至可能已经转义过);两个孩子之间;在child2
与lxml
之后,应该如何做到这一点?我问,因为看起来,lxml
中没有单独的文本节点,只能访问text
的{{1}}属性,我找不到任何文本节点API文档中的解决方案......
无论如何,期望的最终结果看起来像这样:
Element
答案 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'