Python BeautifulSoup как получить значения между тегами?

Моя структура html:

<div>
 <h6>Game1. How to get all listings below and assign to class"game"?</h6>
 <ul>
 <li>
 </li></ul>
 <ul>
 <li>
 </li></ul>
 <ul>
 <li>
 </li></ul>
 <h6>Game2. How to get all listings below and assign to class"game?</h6>
 <ul>
 <li>
 </li></ul>
 <h6>Game3. How to get all listings below and assign to class"game?</h6>
 <ul>
 <li>
 </li></ul>
</div>

Это один div-блок. В основном мне нужно создать список каждого класса h6. первые списки h6 - 3, второй листинг h6 - 1, третий листинг h6 - 1. Есть ли способ сделать это с помощью BeautifulSoup? спасибо

1 ответ

Вы можете .find_next_siblings() итерацию по результату .find_next_siblings() которые являются

    элементами:
    from itertools import takewhile, ifilter
    
    div = soup.find('div', class_='layout4-background')
    for header in div.find_all('h6'):
     print header.get_text()
     listings = takewhile(lambda t: t.name == 'ul',
     header.find_next_siblings(text=False))
     for listing in listings:
     # do something with listing

    find_next_siblings() находит все узлы, которые не являются только текстовыми узлами (пропускание пробелов между ними). itertools.takewhile() позволяет вам выбирать только следующие элементы, которые являются тегами

      .

      Демо-версия:

      >>> from bs4 import BeautifulSoup
      >>> from itertools import takewhile
      >>> soup = BeautifulSoup('''\
      ... <div>
      ... <h6>Game1. How to get all listings below and assign to class"game"?</h6>
      ... <ul>
      ... <li>
      ... </li></ul>
      ... <ul>
      ... <li>
      ... </li></ul>
      ... <ul>
      ... <li>
      ... </li></ul>
      ... <h6>Game2. How to get all listings below and assign to class"game?</h6>
      ... <ul>
      ... <li>
      ... </li></ul>
      ... <h6>Game3. How to get all listings below and assign to class"game?</h6>
      ... <ul>
      ... <li>
      ... </li></ul>
      ... </div>
      ... ''')
      >>> div = soup.find('div', class_='layout4-background')
      >>> for header in div.find_all('h6'):
      ... print header.get_text()
      ... listings = takewhile(lambda t: t.name == 'ul',
      ... header.find_next_siblings(text=False))
      ... print 'Listings found:', len(list(listings))
      ... 
      Game1. How to get all listings below and assign to class"game"?
      Listings found: 3
      Game2. How to get all listings below and assign to class"game?
      Listings found: 1
      Game3. How to get all listings below and assign to class"game?
      Listings found: 1

licensed under cc by-sa 3.0 with attribution.