Вопрос касательно Python и BeautifulSoup

Вот код:

import requests
from bs4 import BeautifulSoup

session = requests.session()
headers = {
    'User - Agent': 'Mozilla / 5.0(Windows NT 6.1;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / '
                    '91.0.4472.101Safari / 537.36OPR / 77.0.4054.90 '
}


def get_html(url):
    html = session.get(url, headers=headers, verify=False)
    if html.ok:
        return html.text
    else:
        print('Ошибка в запросе')


def get_category(item_name, url):
    html = get_html(url)
    soup = BeautifulSoup(html, 'lxml')
    categories = soup.find('ul').find_all('li')
    for category in categories:
        category_name = category.find('div', class_='catalogbar__links__it__txt_inner').find('span').text
        print(category_name)


def get_content(html):
    soup = BeautifulSoup(html, 'lxml')
    catalog_menu = soup.find('ul', id='catalog_menu_ul').find_all('li', class_='catalog_top_items')
    for item in catalog_menu:
        item_name = item.find('div', class_='catalogbar__links__it__txt').find('span').text.strip()
        item_url = 'https://festmarket.ru' + item.find('div', class_='catalogbar__links__it__txt').find('a').get('href')
        print(item_url)
        get_category(item_name, item_url)


def main():
    url = 'https://festmarket.ru'
    get_content(get_html(url))


if __name__ == '__main__':
    main()

Такой вопрос: код работает не до конца и останавливается.Если в функции get_content() закоментировать вызов функции get_category() ,то print(item_url) выводит много ссылок на все категории, по которым должна пройтись функция get_category(). Но почему то если вызывается эта функция, то в нее попадает одна ссылка на первую категорию, парсится, и код останавливается, не переходя по остальным ссылкам.Почему так? Все ведь должно работать, потому что функция get_category() в цикле же...Помогите пожалуйста


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

Автор решения: CrazyElf
    for category in categories:
        category_name = category.find('div', class_='catalogbar__links__it__txt_inner').find('span').text
        print(category_name)

Ваш код падает с ошибкой и его выполнение прекращается, потому что вы не ловите исключения с помощью try/except:

AttributeError: 'NoneType' object has no attribute 'find'

Перебирать найденные элементы нужно несколько по-другому. Может найтись не один элемент, а несколько. А может и ничего не найтись. Поэтому нужно перебирать всё найденное как списки, а не надеяться, что найдётся ровно один элемент. Примерно так:

    for category in categories:
        for div in category.find_all('div', class_='catalogbar__links__it__txt_inner'):
            for span in div.find_all('span'):
                print(span.text)
→ Ссылка