像这样使用 lxml.objectify
:
from lxml import objectify
o = objectify.fromstring("<a><b atr='someatr'>oldtext</b></a>")
o.b = 'newtext'
导致
<a><b>newtext</b></a>
,失去节点属性。它似乎是直接用新创建的元素替换元素,而不是简单地替换元素的文本。如果我尝试使用
o.b.text = 'newtext'
,它会告诉我attribute 'text' of 'StringElement' objects is not writable
。有没有办法在 objectify 中做到这一点,而不必将其拆分为不同的元素并涉及 etree?我只想替换内部文本,同时保留节点的其余部分。我觉得我在这里错过了一些简单的东西。
最佳答案
>>> type(o.b)
<type 'lxml.objectify.StringElement'>
您正在用普通字符串替换元素。您需要用新的字符串元素替换它。
>>> o.b = objectify.E.b('newtext', atr='someatr')
出于某种原因,你不能只做:
>>> o.b.text = 'newtext'
但是,这似乎有效:
>>> o.b._setText('newtext')
关于python - 使用 lxml.objectify 替换节点文本,同时保留属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2150838/