【问题标题】:How to replace an HTML tag with text inside an lxml iterwalk loop如何用 lxml iterwalk 循环中的文本替换 HTML 标记
【发布时间】:2014-07-30 01:22:34
【问题描述】:

我正在使用 lxml iterwalk 遍历 HTML 树,我想用换行符替换 <pre></pre> 内的所有 <br> 标记。这就是我目前所拥有的:

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"

如果可能的话,替换应该在这个循环中完成,因为无论如何我们都需要循环,并且在其中包含这一步可能是最有效的方法。

关于 SO 有一个类似的问题/答案,但它无助于解决问题: How can one replace an element with text in lxml?

【问题讨论】:

  • 我问过一个类似的问题 - 但我没有将 iterwalk 作为条件。
  • 您对基于BeautifulSoup 的解决方案是否满意,或者lxml 是必需的?
  • lxml 是一个要求——它很快,这正是我们所需要的。但是文档是纯粹的恐怖:-P
  • 好的,使用BeautifulSoup 非常简单直接。

标签: python html replace html-parsing lxml


【解决方案1】:

我知道您有 lxml 作为要求,但是使用 BeautifulSoup 来解析和修改 HTML 更容易和有趣。如果速度在这里真的很重要,您可以使用lxml 作为underlying parser

from bs4 import BeautifulSoup

text = """
<div>
    <pre>
        <br>
        test
        <br>
    </pre>
    <br>
</div>
"""

soup = BeautifulSoup(text, "lxml")
for pre in soup.find_all('pre'):
    for br in pre.find_all('br'):
        br.replace_with('\n')

print soup.prettify()

打印:

<html>
 <body>
  <div>
   <pre>


        test


    </pre>
   <br/>
  </div>
 </body>
</html>

【讨论】:

    【解决方案2】:

    drop_tree() 方法正是你所需要的:

    .drop_tree():

    删除元素及其所有子元素。不像 el.getparent().remove(el) 这不会删除尾部文本;和 drop_tree 尾部文本与前一个元素合并。

    找到pre 中的所有br 元素,将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)
    

    打印:

    <div>
        <pre>
    
    
            test
    
    
        </pre>
        <br/>
    </div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多