Как получить список всех родительских тегов в BeautifulSoup? - PullRequest
3 голосов
/ 20 сентября 2010

Допустим, у меня есть такая структура:

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

7 голосов
/ 20 сентября 2010

Вот мой удар:

>>> 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]
3 голосов
/ 20 сентября 2010

bookmarks[0].findParents('folder') вернет вам список всех родительских узлов.Затем вы можете перебирать их и использовать их атрибут name.

...