使用lxml.objectify替换节点文本同时保留属性
使用 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'
,系统会告诉我
StringElement 对象的 'text' 属性是不可写的
。
有没有办法在 objectify 中做到这一点,而不需要把它拆分成不同的元素,也不涉及 etree?我只是想替换内部文本,同时保留节点的其他部分。我觉得我可能漏掉了一些简单的东西。
1 个回答
10
>>> type(o.b)
<type 'lxml.objectify.StringElement'>
你正在用一个普通的字符串替换一个元素。你需要用一个新的字符串元素来替换它。
>>> o.b = objectify.E.b('newtext', atr='someatr')
出于某种原因,你不能直接这样做:
>>> o.b.text = 'newtext'
不过,这样做似乎有效:
>>> o.b._setText('newtext')