使用lxml.objectify替换节点文本同时保留属性

4 投票
1 回答
3734 浏览
提问于 2025-04-15 18:34

使用 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')

撰写回答