Весь представленный вами код можно сократить до нескольких строчек, если использовать XHR. Как анализировать сайты в браузере в вкладке Network можно посмотреть в других моих ответах, например здесь.
import requests
query = 'Touareg'
api_url = 'https://www.kroon-oil.com/api/carlist.json'
car_models = requests.post(api_url, json={"query":query}).json()
Всё, теперь у нас в car_models
список всех автомобилей найденных по запросу.
Но дальше необходимо выбрать автомобиль и получить масло, верно?
Возьмём какую-нибудь отдельно взятую модель, например мою любимую, дизельную. Посмотрим что есть в выданном json.
car_models['response'][1]
:
{'label_minimal': 'Volkswagen (VW) (EU) Touareg 2.5 TDI DPF (2006-2010)',
'label': 'Volkswagen (VW) (EU) Touareg 7L Touareg 2.5 TDI DPF (2006-2010)',
'type_id': 31013,
'type_url_name': 'touareg-25-tdi-dpf',
'model_url_name': 'touareg-7l',
'model_name': 'Touareg 7L',
'make_url_name': 'volkswagen-vw-eu',
'make_name': 'Volkswagen (VW) (EU)',
'category_url_name': 'cars',
'category_name': 'Cars'}
Ссылка на результирующую страницу собирается из этих данных, и по ней уже, к сожалению, api нет, придётся парсить масло со страницы.
Причём сами рекомендации масла по секциям загружаются в отдельных страницах, так что запросов будет много. Если, конечно, необходимо раскрыть все секции.
from bs4 import BeautifulSoup as BS
car = car_models['response'][1]
base_url = 'https://www.kroon-oil.com/ru/product-recommendation/cars/{}/{}/{}/{}'
url = base_url.format(car['make_url_name'],
car['model_url_name'],
car['type_url_name'],
car['type_id'])
soup = BS(requests.get(url).content, 'lxml')
sections = soup.find_all('h2')
for section in sections:
print(section.text.strip('\n'))
section_url = url+'/'+section.parent['data-componentid']
soup = BS(requests.get(section_url).content, 'lxml')
products = soup.find('ul', class_='recommended-products').find_all('h3')
for product in products:
print('\t{}'.format(product.text))
Вывод:
Двигатель BPD, BPE
Helar SP LL-03 5W-30
Дифференциал задний
SP Gear 1011
Syngear TDL 75W-90
Дифференциал задний самоблокирующийся (4x4)
SP Gear 1071
Дифференциал передний
SP Gear 1011
Syngear TDL 75W-90
Коробка передач в блоке с главной передачей автом 09D 6/1
SP Matic 4026
Коробка передач в блоке с главной передачей механ 08D 6/1
SP Gear 5015
Раздаточная коробка 0AD
SP Gear 1081
Гидравлические тормоза/система сцепления
Drauliquid-LV Super DOT 4
Усилитель рулевого управления
SP Fluid 3013
Система охлаждения
Coolant SP 13
Coolant SP 12
По вашему коду. Лучше использовать lxml
, если он отрабатывает, он быстрее. html.parser
стоит использовать только когда что-то парсится неправильно и / или отсуствует.
Всё что ниже, в супе, как указал выше в ответе, найдётся в лучшем случае только одна секция.
А ещё всем новичкам крайне полезно пройти тур.