2010-09-20 55 views
3

比方说,我有这样的结构:我如何在BeautifulSoup所有父标签的列表?

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

我还想要知道什么时候结束标记打偏。有任何想法吗?

在此先感谢!

回答

7

这里是我的刺吧:

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

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

+0

BS只返回第一个(即时)父母,因为父母和祖父母的名字相同。如果父母和祖父母的姓名不同,它确实会返回两代父母。 – 2010-09-20 17:32:50

相关问题