用lxml.html替换元素

10

我对lxml和HTML解析器还比较陌生,想知道是否有一种方法可以用另一个元素替换树中的某个元素...

例如,我有以下内容:

body = """<code> def function(arg): print arg </code> Blah blah blah <code> int main() { return 0; } </code> """

doc = lxml.html.fromstring(body)
codeblocks = doc.cssselect('code')

for block in codeblocks:
  lexer = guess_lexer(block.text_content())
  hilited = highlight(block.text_content(), lexer, HtmlFormatter())
  doc.replace(block, hilited)

我希望做类似的事情,但这会导致出现“TypeError”,因为“hilited”不是lxml.etree._Element。

这可行吗?

敬礼,


我一直在寻找并注意到BeautifulSoup通过replaceWith具有完全相同的功能,lxml中是否有类似于“this”的东西? (如果没有,那没关系,但我仍然很感兴趣)再次感谢! - tsoporan
2个回答

6
关于lxml,
doc.replace(block, hilited)中, block是lxml的Element对象,hilited是字符串,您不能替换它。
有两种方法可以解决这个问题。
block.text=hilited 

或者

body=body.replace(block.text,hilited)

1
如果你是Python HTML解析器的新手,可以尝试使用BeautifulSoup,这是一个HTML/XML解析器,可以让你轻松地修改解析树

我刚刚看了一下BeautifulSoup,它似乎比lxml.html更适合我的用途。感谢您的建议! - tsoporan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接