Вот мой удар:
>>> 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']
Ключевое отличие от ответа @ eumiro в том, что я использую findAllPrevious
вместо findParents
. Когда я тестировал решение @ eumiro, я обнаружил, что findParents
возвращает только первого (непосредственного) родителя, поскольку имя родителя и деда совпадают.
>>> [p.get('name') for p in bookmarks[0].findParents('folder')]
[u'folder2']
>>> [p.get('name') for p in bookmarks[0].findParents()]
[u'folder2', None]
Возвращает два поколения родителей, если родитель и дедушка имеют разные имена.
>>> 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]