Как перебрать циклом список тегов?

Рейтинг: 0Ответов: 1Опубликовано: 09.08.2023

Есть вот такой html:

<div class="section">
<div class="catalog-music inline_player_playlist">

    <div class="music-popular-wrapper">
        <div class="music-popular__item">
            <div class="popular-play">
                <a class="..."></a>
                <span class="icon-play">
                    ::before
                </span>
                ...
                <div class="popular-play-name">
                    <a class="popular-play-composition" href="/singer/dua+lipa.html" data-pjax-state="">
                        Dua Lipa
                    </a>
                    <span>-</span>
                    <a class="popular-play-author" href="/popsa/*.html" data-pjax-state="">
                        Blow Your Mind
                    </a>
                </div>
            </div>
            <div class="popular-download"></div>
        </div>
    </div>
    <div class="music-popular-wrapper">...</div>
    <div class="music-popular-wrapper">...</div>
    <div class="music-popular-wrapper">...</div>
    <div class="music-popular-wrapper">...</div>

    <!-- Абсолютно такая же структура в этих -->
    <!-- div, как показано выше... -->
    <! --только с разными песнями -->
</div>

есть вот такой python-код:

parsing = soup.find_all("div", class_="music-popular-wrapper")

как написано в документации find_all() возвращает список, так вот хочу перебрать этот список циклом и результат передать функции для дальнейшей обработки... чтобы перебрать циклом захотел посмотреть что за список этот find_all() создает, бац! не смог разобраться что за список он создает... когда взглянул на этот список увидел там следующую страшилку:

parsing[0] - list
[
    0 -> index
    [
        0 -> index
        [],
        1 -> index
        [
            0 -> index
            []
        ]
    ],
]

это возможно не правильно! не смог вообще увидеть структуру этого списка... как вообще перебрать такой список ?

и есть ли какая нибудь функция чтобы увидеть структуру таких сложных списков ?

Вообщем, хочу перебрать циклом каждый <div class="music-popular-wrapper">...</div> и + дочерних элементов... тоесть каждый такой <div class="music-popular-wrapper">...</div> div это элементы списка возвращающая функция find_all()

Ответы

▲ 0

Какую IDE вы используете, какую версию Python, ?
Что-то похоже, что проблема у вас не на стороне BS.

Зарядим ваш html из вопроса, и попробуем посмотреть.

from bs4 import BeautifulSoup as BS

html = '''
<div class="section">
<div class="catalog-music inline_player_playlist">

    <div class="music-popular-wrapper">
        <div class="music-popular__item">
…
    <div class="music-popular-wrapper">...</div>

    <!-- Абсолютно такая же структура в этих -->
    <!-- div, как показано выше... -->
    <! --только с разными песнями -->
</div>
'''

soup = BS(html, 'lxml')
parsing = soup.find_all("div", class_="music-popular-wrapper")
print(parsing[0])
Вывод:
<div class="music-popular-wrapper">
<div class="music-popular__item">
<div class="popular-play">
<a class="..."></a>
<span class="icon-play">
                    ::before
                </span>
                ...
                <div class="popular-play-name">
<a class="popular-play-composition" data-pjax-state="" href="/singer/dua+lipa.html">
                        Dua Lipa
                    </a>
<span>-</span>
<a class="popular-play-author" data-pjax-state="" href="/popsa/*.html">
                        Blow Your Mind
                    </a>
</div>
</div>
<div class="popular-download"></div>
</div>
</div>

Никаких страшилок, выдаёт html код.

Вообщем, хочу перебрать циклом каждый <div class="music-popular-wrapper">...</div> и + дочерних элементов... тоесть каждый такой <div class="music-popular-wrapper">...</div> div это элементы списка возвращающая функция find_all()

Ну а для дочерних элементов есть замечательный .children() и .descendants(). Первый выводит непосредственно вложенные теги первого уровня, а второй все вложенные теги рекурсивно.

from bs4 import NavigableString

for child in parsing[0].children:
    if isinstance(child, NavigableString):
        continue
    print(child.name)
Вывод:
div

for descendant in parsing[0].descendants:
…
Вывод:
div
div
a
span
div
a
span
a
div