这有点(很多......)hack,但可以通过这种方式完成:
假设你的 html 是这样的:
levels = """<div id='rootTag'>
<span>Level2</span>
<div>
<span>Level3</span>
<div>
<span>Level4</span>
</div>
</div>
<div>
<span>Level3</span>
</div>
<div>
<div>
<div>
<div>
<span>Level6</span>
</div>
<span>Level5</span>
</div>
</div>
</div>
</div>"""
然后我们这样做:
#First collect the data:
from lxml import etree #you have to make sure your html is well-formed, or it won't work
root = etree.fromstring(levels)
tree = etree.ElementTree(root)
#collect the paths of all <span> elements
paths = [tree.getpath(e) for e in root.iter('span')]
#determine the nesting level of each <span> element
nests = [e.count('/') for e in paths] #or, alternatively:
#nests = [tree.getpath(e).count('/') for e in root.iter('span')]
从这里开始,我们使用nests 列表中的嵌套级别来提取paths 列表中的可比较元素。例如,要获取嵌套级别最深的<span> 元素:
deepest = nests.index(max(nests))
print(paths[deepest],root.xpath(paths[deepest])[0].text)
输出:
/div/div[3]/div/div/div/span Level6
或者提取具有 4 级嵌套的 <span> 元素:
print(paths[nests.index(4)],root.xpath(paths[nests.index(4)])[0].text)
输出:
/div/div[1]/div/span Level4