Парсинг вложенных списков bs4
<ul class="nav-lvl2-list">
<li class="nav-lvl2-item ">
<a class="nav-lvl2-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/griby-isg24/" aria-label="Грибы">
<span class="nav-lvl2-item-name">Грибы</span>
</a>
</li>
<li class="nav-lvl2-item has-nav ">
<a class="nav-lvl2-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/" aria-label="Овощи">
<span class="nav-lvl2-item-name">Овощи</span>
<span class="nav-lvl2-toggle js-nav-toggle"></span>
</a>
<div class="js-nav nav-lvl3" style="display: none">
<ul class="nav-lvl3-list">
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/drugie-ovoshchi-isg570/" aria-label="Другие овощи">
<span class="nav-lvl3-item-name">Другие овощи</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/imbir-isg571/" aria-label="Имбирь">
<span class="nav-lvl3-item-name">Имбирь</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/kabachok-tsukini-isg572/" aria-label="Кабачок\цукини">
<span class="nav-lvl3-item-name">Кабачок\цукини</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/kapusta-isg573/" aria-label="Капуста">
<span class="nav-lvl3-item-name">Капуста</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/kartofel-isg574/" aria-label="Картофель">
<span class="nav-lvl3-item-name">Картофель</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/kukuruza-isg575/" aria-label="Кукуруза">
<span class="nav-lvl3-item-name">Кукуруза</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/luk-isg576/" aria-label="Лук">
<span class="nav-lvl3-item-name">Лук</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/morkov-isg577/" aria-label="Морковь">
<span class="nav-lvl3-item-name">Морковь</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/ogurets-isg578/" aria-label="Огурец">
<span class="nav-lvl3-item-name">Огурец</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/perets-isg579/" aria-label="Перец">
<span class="nav-lvl3-item-name">Перец</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/redis-redka-isg580/" aria-label="Редис, редька">
<span class="nav-lvl3-item-name">Редис, редька</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/selderey-isg582/" aria-label="Сельдерей">
<span class="nav-lvl3-item-name">Сельдерей</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/tomat-isg583/" aria-label="Томат">
<span class="nav-lvl3-item-name">Томат</span>
</a>
</li>
<li class="nav-lvl3-item ">
<a class="nav-lvl3-link" href="/catalog/ovoshchi-frukty-yagody-griby-zelen-isg187/ovoshchi-isg274/chesnok-isg584/" aria-label="Чеснок">
<span class="nav-lvl3-item-name">Чеснок</span>
</a>
</li>
</ul>
</div>
</li>
</ul>
Я получаю с сайта вот такой вложенный список с категориями. В нем встречаются элементы li с разными классами. В случае если есть вложенность дальше у элемента дописывается класс has-nav. Мне надо получить активные ссылки на категории.
В случае, когда нет has-nav, эта ссылка сразу находится в этом li. Если класс есть эти ссылки находятся уже в <div class="js-nav nav-lvl3" style="display: none"> в котором есть другой ul со всеми ссылками.
Я не понимаю как написать условие, что если <li class="nav-lvl2-item">, то мне сразу в этом теге надо брать ссылку. А если есть класс has-nav надо идти дальше во вложенный список и брать ссылки оттуда.
Пытался так:
for el in resonse.find_all("ul",class_='nav-lvl2-list'):
if el.find('li', class_='has-nav'):
print(el)
но у меня все равно выводятся все элементы... ссылка на сайт
Нужны все ссылки как на картинке. Если нет вложенности то это ссылка сразу в этом элементе. Если есть то ссылке находятся в раскрывающемся списке.
Ответы (1 шт):
Не совсем уверен в чистоте данного способа но вот что получилось
import requests
from bs4 import BeautifulSoup as Soup
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
response = requests.get('https://gippo-market.by/catalog/kulinarnaya-produktsiya-isg359/',headers=headers)
soup = Soup(response.content, 'html.parser')
menu_gippo = soup.find("div", class_="sidebar-menu")
all_li = menu_gippo.find_all("li",class_='nav-item')
for li in all_li:
for el in li.find_all("li",class_='nav-lvl2-item'):
if 'has-nav' not in el['class']:
print(el.find("a")["href"])
else:
for href in el.find_all("li",class_='nav-lvl3-item'):
print(href.find("a")["href"])
проверяю есть ли класс has-nav в элементе, если нет то вывожу ссылку с этого li.
Если есть то беру ссылки уже из li с классом nav-lvl3-item
