Как найти прямых детей (не детей детей) div в html, используя BeautifulSoup? - PullRequest
0 голосов
/ 17 июня 2019

Разметка:

<div class = "parent-div">
    <div class = "child-1">
        <div class = "child-1.1">
        </div>
    </div>
    <div class = "child-2">
        <div class = "child-2.1">
        </div>
    </div>
</div>

Я хочу получить список прямых потомков div [parent-div]

т.е. список как:

[div class = "child-1">
        <div class = "child-1.1">
        </div>
    </div>,<div class = "child-2">
        <div class = "child-2.1">
        </div>
    </div>]

Я использую ниже код BeautifulSoup:

page_soup = soup(page_html,"html.parser")
main_cont = page_soup.find('div',{'class':'parent-div'}).findAll('div')

Этот код дает мне список всех div:

[<div class = "child-1">
        <div class = "child-1.1">
        </div>
    </div>,<div class = "child-1.1">
        </div>,<div class = "child-2">
        <div class = "child-2.1">
        </div>
    </div>,<div class = "child-2.1">
        </div>]

Как получить список только непосредственных потомков родительского div?

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Вы можете использовать селекторы CSS, чтобы сделать это довольно легко. ПРИМЕЧАНИЕ: используя Beautiful Soup 4.7+. В частности, используя дочерний комбинатор: https://developer.mozilla.org/en-US/docs/Web/CSS/Child_combinator.

from bs4 import BeautifulSoup

html = """
<div class = "parent-div">
    <div class = "child-1">
        <div class = "child-1.1">
        </div>
    </div>
    <div class = "child-2">
        <div class = "child-2.1">
        </div>
    </div>
</div>
"""

soup = BeautifulSoup(html, 'html.parser')

print(soup.select('div.parent-div > *'))

Выход

[<div class="child-1">\n<div class="child-1.1">\n</div>\n</div>, <div class="child-2">\n<div class="child-2.1">\n</div>\n</div>]
0 голосов
/ 17 июня 2019

Вы можете использовать findChildren() метод для получения дочерних тегов.

main_cont = soup.find('div',{'class':'parent-div'}).findChildren('div',recursive=False)

Вывод:

[<div class="child-1"><div class="child-1.1"></div></div>, <div class="child-2"><div class="child-2.1"> </div></div>]
...