Sim*_*ger 2 html python lxml replace html-parsing
我正在使用 lxml iterwalk 迭代 HTML 树,我想用新行字符替换<br>里面的所有标签。<pre></pre>这就是我到目前为止所拥有的:
root = lxml.html.fromstring(text)
for action, el in etree.iterwalk(root):
if el.tag == 'pre':
for br in el.xpath('br'):
# replace this <br> tag with "\n"
Run Code Online (Sandbox Code Playgroud)
如果可能的话,替换实际上应该在这个循环内完成,因为无论如何我们都需要循环,并且在其中包含此步骤可能是最有效的方法。
SO 上有一个类似的问题/答案,但它无助于解决问题: How can one Replace an element with text in lxml?
drop_tree()方法正是您所需要的:
.drop_tree():
删除该元素及其所有子元素。与 el.getparent().remove(el) 不同,这不会删除尾部文本;使用 drop_tree 尾部文本将与前一个元素合并。
查找br内的所有元素pre,将 设为tail并\n删除该元素:
from lxml import etree
import lxml.html
text = """
<div>
<pre>
<br>
test
<br>
</pre>
<br>
</div>
"""
root = lxml.html.fromstring(text)
for action, el in etree.iterwalk(root):
if el.tag == 'pre':
for br in el.xpath('br'):
br.tail = '\n' + br.tail
br.drop_tree()
print etree.tostring(root)
Run Code Online (Sandbox Code Playgroud)
印刷:
<div>
<pre>
test
</pre>
<br/>
</div>
Run Code Online (Sandbox Code Playgroud)