Весь представленный вами код можно сократить до нескольких строчек, если использовать 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 стоит использовать только когда что-то парсится неправильно и / или отсуствует.
Всё что ниже, в супе, как указал выше в ответе, найдётся в лучшем случае только одна секция.
А ещё всем новичкам крайне полезно пройти тур.