BeautifulSoup анализ и организация данных - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть html, структурированный как пример ниже:

<div class="container">
    <div class="row">
        <div class="otherattr">
                <div id="listalbum">
                    <div id="9067" class="album">album: <b>"Name of the album"</b> (2001)</div>
                    <div class="listalbum_item"> </div>
                    <div class="listalbum_item"> </div>
                    <div class="listalbum_item"> </div>
                    <div id=91453, class="album">album: <b>"other Name of album"</b> (2007) </div>
                    <div class="listalbum_item"> </div>
                    <div class="listalbum_item"> </div>
                    <div class="listalbum_item"> </div>
                    <div class="listalbum_item"> </div>
                    <div id=56739, class="album">album: <b>"another album"</b> (2012) </div>
                    <div class="listalbum_item"> </div>
                    <div class="listalbum_item"> </div>
                    <div class="listalbum_item"> </div>
                    <div class="listalbum_item"> </div>
                    <div class="listalbum_item"> </div>
                </div>
        </div>
    </div>
</div>

Моя цель состоит в том, чтобы извлечь теги с id = somenumber (это число между прочим всегда для каждого тега) и извлеките также другие теги с помощью listalbum_item - для простоты мы предполагаем, что в этих тегах есть какой-то текст или какая-то ссылка, не имеет значения -

Как вы видеть, что html организован так, чтобы показывать название альбома и все песни в этом альбоме. Я хочу создать некоторую структуру (скажем, словарь), например:

dix = {'album_1' : ['song1','song2','song3','song4'] , 'album_3' : ['song1','song2','song3','song4']}

как вы можете это сделать? для меня проблема в том, что у id есть число, которое меняется каждый раз (и это просто пример, но мне нужно проанализировать очень большой сайт с большим количеством артистов (и, следовательно, с большим количеством альбомов и песен), и у меня проблемы с организацией данные в порядке и порядке ординат. Мне удалось создать список только с тегом песни, но мне нужно отделить песню для альбома, к которому они принадлежат

большое спасибо !!!

1 Ответ

1 голос
/ 08 апреля 2020

Сначала необходимо определить альбом, а затем найти find_next_siblings(), а затем убедиться, что find_previous_sibling() соответствует атрибуту альбома ID

Код :

data='''<div class="container">
    <div class="row">
        <div class="otherattr">
                <div id="listalbum">
                    <div id="9067" class="album">album: <b>"Name of the album"</b> (2001)</div>
                    <div class="listalbum_item">song1</div>
                    <div class="listalbum_item">song2</div>
                    <div class="listalbum_item">song3</div>
                    <div id="91453" class="album">album: <b>"other Name of album"</b> (2007) </div>
                    <div class="listalbum_item">song1</div>
                    <div class="listalbum_item">song4</div>
                    <div class="listalbum_item">song2</div>
                    <div class="listalbum_item">song3</div>
                    <div id="56739" class="album">album: <b>"another album"</b> (2012) </div>
                    <div class="listalbum_item">song5</div>
                    <div class="listalbum_item">song1</div>
                    <div class="listalbum_item">song3</div>
                    <div class="listalbum_item">song2</div>
                    <div class="listalbum_item">song4</div>
                </div>
        </div>
    </div>
</div>'''

album={}

soup=BeautifulSoup(data,"html.parser")
for item in soup.select("#listalbum > .album"):
    name=item.find_next('b').text
    songs = []
    for song in item.find_next_siblings('div',class_="listalbum_item"):

        if song.find_previous_sibling('div',class_='album')['id'] == item['id']:
            songs.append(song.text)

    album[name]=songs

print(album)

Выход :

{'"Name of the album"': ['song1', 'song2', 'song3'], '"another album"': ['song5', 'song1', 'song3', 'song2', 'song4'], '"other Name of album"': ['song1', 'song4', 'song2', 'song3']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...