这里是我的刺吧:
>>> from BeautifulSoup import BeautifulSoup
>>> html = """<folder name="folder1">
<folder name="folder2">
<bookmark href="link.html">
</folder>
</folder>
"""
>>> 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]
BS只返回第一个(即时)父母,因为父母和祖父母的名字相同。如果父母和祖父母的姓名不同,它确实会返回两代父母。 – 2010-09-20 17:32:50