如何获取BeautifulSoup中所有父标签的列表?

时间:2010-09-20 14:18:35

标签: python html-parsing beautifulsoup xml-parsing

假设我有这样的结构:

<folder name="folder1">
     <folder name="folder2">
          <bookmark href="link.html">
     </folder>
</folder>

如果我指向书签,那么只提取所有文件夹行的命令是什么? 例如,

bookmarks = soup.findAll('bookmark')

然后beautifulsoupcommand(bookmarks[0])将返回:

[<folder name="folder1">,<folder name="folder2">]

我也想知道结尾标签何时也会出现。有什么想法吗?

提前致谢!

2 个答案:

答案 0 :(得分:7)

这是我的抨击:

>>> 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]

答案 1 :(得分:3)

bookmarks[0].findParents('folder')将返回所有父节点的列表。然后,您可以迭代它们并使用它们的name属性。