【发布时间】: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