【问题标题】:Editing tree in place while iterating in lxml在lxml中迭代时编辑树
【发布时间】:2011-09-03 09:17:44
【问题描述】:

我正在使用 lxml 来解析 html 并对其进行编辑以生成新文档。从本质上讲,我正在尝试使用它有点像 javascript DOM - 我知道这并不是真正的预期用途,但到目前为止大部分都运行良好。

目前,我使用 iterdescendants() 来获取一个可迭代的元素列表,然后依次处理每个元素。

但是,如果在迭代过程中删除了一个元素,则仍会考虑其子元素,因为删除不会影响迭代,正如您所期望的那样。为了得到我想要的结果,这个 hack 有效:

from lxml.html import fromstring, tostring
import urllib2
import re

html = '''
<html>
<head>
</head>

<body>
    <div>
        <p class="unwanted">This content should go</p>
        <p class="fine">This content should stay</p>
    </div>

    <div id = "second" class="unwanted">
        <p class = "alreadydead">This content should not be looked at</p>
        <p class = "alreadydead">Nor should this</>
        <div class="alreadydead">
            <p class="alreadydead">Still dead</p>
        </div>
    </div>

    <div>
        <p class="yeswanted">This content should also stay</p>
    </div>
</body>

for element in allElements:
   s = "%s%s" % (element.get('class', ''), element.get('id', ''))        
   if re.compile('unwanted').search(s):
       for i in range(len(element.findall('.//*'))):
           allElements.next()
       element.drop_tree()

print tostring(page.body)

这个输出:

<body>
    <div>

        <p class="yeswanted">This content should stay</p>
    </div>



    <div>
        <p class="yeswanted">This content should also stay</p>
    </div>
</body>

这感觉像是一个讨厌的 hack - 有没有更明智的方法来使用库来实现这一点?

【问题讨论】:

    标签: python parsing html-parsing lxml


    【解决方案1】:

    为了简化事情,您可以使用lxml's support for regular expressions within an XPath 来查找并杀死不需要的节点,而无需遍历所有后代。

    这会产生与您的脚本相同的结果:

    EXSLT_NS = 'http://exslt.org/regular-expressions'
    XPATH = r"//*[re:test(@class, '\bunwanted\b') or re:test(@id, '\bunwanted\b')]"
    
    tree = lxml.html.fromstring(html)
    for node in tree.xpath(XPATH, namespaces={'re': EXSLT_NS}):
        node.drop_tree()
    print lxml.html.tostring(tree.body)
    

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 2019-01-09
      • 1970-01-01
      • 2015-07-25
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      相关资源
      最近更新 更多