Парсинг 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">
Безалкогольный прохладительный напиток с узнаваемым вкусом. Популярен с 1898 г. Pepsi-Cola — первый продукт США. который делали в СССР: завод построили в Новороссийске в 1974 г.. бутылки с «Пепси» массово продавались
в Москве во время Олимпиады-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('Состав', '"Состав" не найден в описании')