Парсинг BS4 когда нет уникального класса

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

<div class="description-attributes">
  <div class="description-item">
    <div class="description-item-name col-xs-5">
      Бренд
    </div>
    <div class="description-item-link description-item-value description-item-bold col-xs-7"><a href="/brands/pepsi" class="">Pepsi</a></div>
    <div class="clearfix"></div>
  </div>
  <div class="description-item">
    <div class="description-item-name col-xs-5">
      Краткое описание
    </div>
    <div class="description-item-value col-xs-7">
      Безалкогольный прохладительный напиток с&nbsp;узнаваемым вкусом. Популярен с&nbsp;1898&nbsp;г. Pepsi-Cola&nbsp;— первый продукт США. который делали в&nbsp;СССР: завод построили в&nbsp;Новороссийске в&nbsp;1974&nbsp;г.. бутылки с&nbsp;«Пепси» массово продавались
      в&nbsp;Москве во&nbsp;время Олимпиады-80.
    </div>
    <div class="clearfix"></div>
  </div>
  <div class="description-item">
    <div class="description-item-name col-xs-5 description-item-bold">
      Состав
    </div>
    <div class="description-item-value col-xs-7">
      вода, сахар, комплексная пищевая добавка (краситель Е150d, регулятор кислотности Е338, вода, кофеин (103-110 мг/л)), ароматизатор натуральный (в составе стабилизатор гуммиарабик, регулятор кислотности лимонная кислота).
    </div>
    <div class="clearfix"></div>
  </div>
  <div class="description-item">
    <div class="description-item-name col-xs-5">
      Производитель
    </div>
    <div class="description-item-value col-xs-7 description-item-bold">
      Лидское пиво
    </div>
    <div class="clearfix"></div>
  </div>
  <div class="description-item">
    <div class="description-item-name col-xs-5">
      Страна производства
    </div>
    <div class="description-item-value col-xs-7 description-item-bold">
      Беларусь
    </div>
    <div class="clearfix"></div>
  </div>
</div>

Знаю, что можно написать примерно так:

sostav = soup.find_all("div", {"class":"description-item-value col-xs-7"})
print(sostav[1])

Но это не гибко: состав может быть и не вторым элементом в списке.
Как быть в таком случае?


Ответы (1 шт):

Автор решения: Jack_oS
import requests
from bs4 import BeautifulSoup

url = 'https://p24.by/goods/produkty/soki-vody-napitki/soki-nektary/nektary/product/nektar-195l-tetra-pak-ananas-oazis-grup-belarus-sochnyi~4813538005562'
headers = {'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}

r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'html.parser')
descriptions = soup.find_all('div', class_='description-item')

я бы записывал в словарь:

desc_dict = dict()
for d in descriptions:
    name = d.find('div', class_='description-item-name').text.strip()
    value = d.find('div', class_='description-item-value').text.strip()
    # print(name, value)
    desc_dict.update({name: value})

теперь в desc_dict будет:

>>> desc_dict
{'Краткое описание': 'Если вам взгрустнулось, срочно вызывайте ананас, потому что это самый весёлый фрукт! Даже серьезные учёные не выдержали и назвали ананас хохлатым. «Сочный Ананас» создаёт настроение!', 'Состав': 'Сок ананасовый, сахар, регулятор кислотности лимонная кислота, вода питьевая подготовленная. Изготовлен из концентрированного Сока. Без ГМО. Без красителей. Без консервантов.', 'Производитель': 'Оазис Груп', 'Страна производства': 'Беларусь', 'Белки, г': '0.2', 'Углеводы, г': '11', 'Срок годности': '547 дней', 'Условия хранения': 'хранить при температуре воздуха от 0С до + 25С и относительной влажности не более 75 %. После вскрытия упаковки хранить в холодильнике при температуре от 4С до + 6С.'}

в desc_dict['Состав'], где бы оно ни было, соответственно:

>>> desc_dict['Состав']
'Сок ананасовый, сахар, регулятор кислотности лимонная кислота, вода питьевая подготовленная. Изготовлен из концентрированного Сока. Без ГМО. Без красителей. Без консервантов.'

или даже так (вдуг не будет Состав в описании):

desc_dict.get('Состав', '"Состав" не найден в описании')
→ Ссылка