Вопрос касательно 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 шт):
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)