Как спарсить только нужные div на Python

300
20 декабря 2021, 19:30

Подскажите, пожалуйста, как собрать только нужные данные у блоков, если они не вложены в те, по которым их можно идентифицировать. Проще говоря, есть сайт, у него структура построена следующим образом:

<div class="sportName baseball">
    <div class="event__header">
        <div class="icon--flag event__title fl_205" title="Венесуэла">
            <div class="event__titleBox">
               <span class="event__title--type">ВЕНЕСУЭЛА</span>
               <span class="event__title--name" title="ЛВБП">ЛВБП</span>
            </div>
        </div>
    </div>
    <div id="g_6_MmpBOXpa" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
    <div id="g_6_MmpBOtha" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
    <div id="g_6_MmprgOXpa" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
    <div class="event__header">
        <div class="icon--flag event__title fl_205" title="Мексика">
            <div class="event__titleBox">
                <span class="event__title--type">МЕКСИКА</span>
                <span class="event__title--name" title="ЛМП">ЛМП</span>
            </div>
        </div>
    </div>
    <div id="g_6_Mmthrpa" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
    <div id="g_6_MthrBOtha" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
    <div id="g_6_MmprgOjtr" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
</div>

Можно ли как-то прописать, что если содержимое div с class="event__header" удовлетворяет условиям, содержит в тегах <span class="event__title--type">ВЕНЕСУЭЛА</span> и <span class="event__title--name" title="ЛВБП">ЛВБП</span> ВЕНЕСУЭЛА и ЛВБПЭ, соответственно, то собираем, например, id у div title="Подробности матча!", до следующего div с class="event__header", или есть другие более правильные варианты?

Заранее спасибо за помощь!

ПРАВКИ: Как-то не выходит использовать find_next_siblings, может кто знает, что не так?

from bs4 import BeautifulSoup
test_html = """
<div class="sportName baseball">
    <div class="event__header">
        <div class="icon--flag event__title fl_205" title="Венесуэла">
            <div class="event__titleBox">
                <span class="event__title--type">ВЕНЕСУЭЛА</span>
                <span class="event__title--name" title="ЛВБП">ЛВБП</span>
            </div>
        </div>
    </div>
    <div id="g_6_MmpBOXpa" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
    <div id="g_6_MmpBOtha" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
    <div id="g_6_MmprgOXpa" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
    <div class="event__header">
        <div class="icon--flag event__title fl_205" title="Мексика">
            <div class="event__titleBox">
                <span class="event__title--type">МЕКСИКА</span>
                <span class="event__title--name" title="ЛМП">ЛМП</span>
            </div>
        </div>
    </div>
    <div id="g_6_Mmthrpa" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
    <div id="g_6_MthrBOtha" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
    <div id="g_6_MmprgOjtr" title="Подробности матча!" class="event__match event__match--scheduled event__match--twoLine"></div>
</div>
"""
soup = BeautifulSoup(test_html, 'html.parser')
current = soup.find_all("div", class_="event__header")
liga = []
for i in current:
    span1 = i.find_all("span")
    for j in span1:
        span2 = j.get_text()
        liga.append(span2)
        print(span2)
print(liga)
span3 = ["МЕКСИКА"]
for m in span2:
    if m in span3:
        s = current.find_next_siblings("div")
        print(s)
    else:
        print("Совпадений нет") 
Answer 1

from bs4 import BeautifulSoup 
test_html = """ 
<div class="sportName baseball"> 
    <div class="event__header"> 
       <div class="icon--flag event__title fl_205" title="Венесуэла"> 
          <div class="event__titleBox"> 
             <span class="event__title--type">ВЕНЕСУЭЛА</span> 
             <span class="event__title--name" title="ЛВБП">ЛВБП</span> 
          </div> 
       </div> 
    </div> 
    <div id="g_6_UyjXVFhP" title="Подробности матча!" class="event__match event__match--twoLine"> 
       <div class="event__check"></div> 
       <div class="event__stage"> 
          <div class="event__stage--block">Завершен</div> 
       </div> 
       <div class="event__participant event__participant--home">Ла Гуайра</div> 
       <div class="event__participant event__participant--away fontBold">Маргарита</div> 
       <div class="event__score event__score--home">5</div> 
       <div class="event__score event__score--away">7</div> 
       <div class="event__part event__part--home event__part--1">0</div> 
       <div class="event__part event__part--away event__part--1">0</div> 
       <div class="event__part event__part--home event__part--2">0</div> 
       <div class="event__part event__part--away event__part--2">0</div> 
       <div class="event__part event__part--home event__part--3">0</div> 
       <div class="event__part event__part--away event__part--3">0</div> 
       <div class="event__part event__part--home event__part--4">1</div> 
       <div class="event__part event__part--away event__part--4">1</div> 
       <div class="event__part event__part--home event__part--5">2</div> 
       <div class="event__part event__part--away event__part--5">0</div> 
       <div class="event__part event__part--home event__part--6">0</div> 
       <div class="event__part event__part--away event__part--6">1</div> 
       <div class="event__part event__part--home event__part--7">0</div> 
       <div class="event__part event__part--away event__part--7">0</div> 
       <div class="event__part event__part--home event__part--8">0</div> 
       <div class="event__part event__part--away event__part--8">0</div> 
       <div class="event__part event__part--home event__part--9">2</div> 
       <div class="event__part event__part--away event__part--9">3</div> 
       <div class="event__part event__part--home event__part--10">0</div> 
       <div class="event__part event__part--away event__part--10">2</div> 
       <div class="event__spacer event__spacer--home"></div> 
       <div class="event__spacer event__spacer--away"></div> 
       <div class="event__part event__part--home event__part--11">14</div> 
       <div class="event__part event__part--away event__part--11">13</div> 
       <div class="event__part event__part--home event__part--12">0</div> 
       <div class="event__part event__part--away event__part--12">2</div> 
       <div class="event__check"></div> 
       <div class="event__icons"> 
          <div class="event__icon icon--info"></div> 
       </div> 
    </div> 
    <div id="g_6_6csaRZ0t" title="Подробности матча!" class="event__match event__match--twoLine"> 
       <div class="event__check"></div> 
       <div class="event__stage"> 
          <div class="event__stage--block">Завершен</div> 
       </div> 
       <div class="event__participant event__participant--home">Лара</div> 
       <div class="event__participant event__participant--away fontBold">Каракас</div> 
       <div class="event__score event__score--home">4</div> 
       <div class="event__score event__score--away">9</div> 
       <div class="event__part event__part--home event__part--1">2</div> 
       <div class="event__part event__part--away event__part--1">2</div> 
       <div class="event__part event__part--home event__part--2">0</div> 
       <div class="event__part event__part--away event__part--2">5</div> 
       <div class="event__part event__part--home event__part--3">0</div> 
       <div class="event__part event__part--away event__part--3">0</div> 
       <div class="event__part event__part--home event__part--4">0</div> 
       <div class="event__part event__part--away event__part--4">0</div> 
       <div class="event__part event__part--home event__part--5">0</div> 
       <div class="event__part event__part--away event__part--5">0</div> 
       <div class="event__part event__part--home event__part--6">0</div> 
       <div class="event__part event__part--away event__part--6">0</div> 
       <div class="event__part event__part--home event__part--7">0</div> 
       <div class="event__part event__part--away event__part--7">0</div> 
       <div class="event__part event__part--home event__part--8">1</div> 
       <div class="event__part event__part--away event__part--8">0</div> 
       <div class="event__part event__part--home event__part--9">1</div> 
       <div class="event__part event__part--away event__part--9">2</div> 
       <div class="event__spacer event__spacer--home"></div> 
       <div class="event__spacer event__spacer--away"></div> 
       <div class="event__part event__part--home event__part--11">8</div> 
       <div class="event__part event__part--away event__part--11">15</div> 
       <div class="event__part event__part--home event__part--12">3</div> 
       <div class="event__part event__part--away event__part--12">0</div> 
       <div class="event__icons"></div> 
    </div> 
    <div class="event__header"> 
       <div class="icon--flag event__title fl_205" title="Мексика"> 
          <div class="event__titleBox"> 
             <span class="event__title--type">МЕКСИКА</span> 
             <span class="event__title--name" title="ЛМП">ЛМП</span> 
          </div> 
       </div> 
    </div> 
    <div id="g_6_Mmthrpa" title="Подробности матча!" class="event__match event__match--twoLine"></div> 
    <div id="g_6_MthrBOtha" title="Подробности матча!" class="event__match event__match--twoLine"></div> 
    <div id="g_6_MmprgOjtr" title="Подробности матча!" class="event__match event__match--twoLine"></div> 
</div> """ 
 
soup = BeautifulSoup(test_html, 'html.parser') 
liga = [] 
 
ehlist = soup.find_all('div', attrs={'class':'event__header'}) 
for eh in ehlist: 
tlist = eh.find_all('div', attrs={'title':'Венесуэла'}) 
if tlist: 
    for t in tlist: 
        splist = t.find_all('span') 
        for sp in splist: 
            text = sp.get_text() 
            liga.append(text) 
        print(liga[0] + ": " + liga[1]) 
        print(' ' * 21 + 'Оч  1  2  3  4  5  6  7  8  9 ДИ  Х Ош') 
        print(' ' * 21 + '-' * 38) 
         
        slist = eh.find_next_siblings() # выборка тегов с данными о матчах 
        x = None 
        while x == None: 
            slist.remove(slist[-1]) 
            for s in slist: 
                x = s.find('span')                
        slist.remove(slist[-1]) 
         
        for s in slist:                 # формирование строк данных 
            text = s.get_text() 
            events = text.split('\n')[5:] 
            eup = events[2::2] 
            edn = events[3::2] 
            if eup[10] != '': 
                eup.remove(eup[11]) 
            if edn[10] != '': 
                edn.remove(edn[11]) 
             
            print('%-20s' % events[0], end='')   # форматирование таблицы 
            for u in eup: 
                print('%+3s' % u, end = '') 
            print('\n%-20s' % events[1], end='')     
            for d in edn: 
                print('%+3s' % d, end = '') 
            print('\n')

К вопросу об использовании find_next_sibligs().

READ ALSO
Сбивается отступ от внешнего блока если убрать границу (html-вёрстка)

Сбивается отступ от внешнего блока если убрать границу (html-вёрстка)

Я пытаюсь сделать margin-отступ от внешнего блокаouter

229
Меню аккордеон, как закрыть активный пункт меню?

Меню аккордеон, как закрыть активный пункт меню?

Есть меню типо аккордеона, нужно сделать что бы открытый пункт можно было закрыть, то есть что бы 2 элемента были закрыты

299