如何用 lxml iterwalk 循环内的文本替换 HTML 标签

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?

ale*_*cxe 5

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)