<p>这是我的尝试:</p>
<pre><code>>>> from BeautifulSoup import BeautifulSoup
>>> html = """<folder name="folder1">
<folder name="folder2">
<bookmark href="link.html">
</folder>
</folder>
"""
>>> soup = BeautifulSoup(html)
>>> bookmarks = soup.findAll('bookmark')
>>> [p.get('name') for p in bookmarks[0].findAllPrevious(name = 'folder')]
[u'folder2', u'folder1']
</code></pre>
<p>与@eumiro的答案不同的是,我使用的是<code>findAllPrevious</code>,而不是<code>findParents</code>。当我测试@eumiro的解决方案时,我发现<code>findParents</code>只返回第一个(直接)父级,因为父级和祖级的名称是相同的。</p>
<pre><code>>>> [p.get('name') for p in bookmarks[0].findParents('folder')]
[u'folder2']
>>> [p.get('name') for p in bookmarks[0].findParents()]
[u'folder2', None]
</code></pre>
<p>如果父母和祖父母的名字不同,它确实会让两代人的父母回归。</p>
<pre><code>>>> html = """<folder name="folder1">
<folder_parent name="folder2">
<bookmark href="link.html">
</folder_parent>
</folder>
"""
>>> soup = BeautifulSoup(html)
>>> bookmarks = soup.findAll('bookmark')
>>> [p.get('name') for p in bookmarks[0].findParents()]
[u'folder2', u'folder1', None]
</code></pre>