Как я могу применить find_all 2 раза для синтаксического анализа

#python #web-scraping #beautifulsoup

#python #веб-очистка #beautifulsoup

Вопрос:

Я пытаюсь создать веб-скребок, который будет очищать веб-сайт для

  • с помощью класса product_cat-riso он находит все
  • , но затем я хочу проверить, есть ли они на складе — те, которые есть на складе, также имеют класс ‘instock’ в качестве дополнения к product_cat-riso. Я пытался использовать filter() здесь, но не работает.
     from bs4 import BeautifulSoup
    import requests
    
    url = 'https://eshop.ciernediery.sk/'
    req = requests.get(url, timeout=5)
    soup = BeautifulSoup(req.content, 'html.parser')
    lst = soup.find_all('li', class_='product_cat-riso')
    
    def fltr(item):
        if 'instock' in item:
            return True
        else:
            return False
    in_stock = filter(fltr, lst)
    for item in in_stock:
        print(item)
     
  • Комментарии:

    1. Пожалуйста, предоставьте минимальный рабочий код (URL …)

    2. мой плохой, я его не копировал

    3. вы уверены, что это правильный веб-сайт? Я не могу найти ни один из упомянутых вами классов. lst возвращает пустой

    4. Я вижу только 1 похожий product_cat-risografiky — это правильный URL?

    5. Вы правы, я просто пытался провести некоторое тестирование и забыл вернуть его обратно, но у меня было это на risografiky при попытке

    Ответ №1:

    Я буду работать, исходя из предположения, что вы указали только часть одного из имен классов, и это полное имя класса product_cat-risografiky (единственное из многозначного класса). У меня возникнет соблазн сократить логику fltr() , а затем убедиться, что проверка членства находится в списке значений класса для тега, а не для объекта тега.

     from bs4 import BeautifulSoup
    import requests
    
    def fltr(item):
        return 'instock' in item['class']
    
    url = 'https://eshop.ciernediery.sk/'
    req = requests.get(url, timeout=5)
    soup = BeautifulSoup(req.content, 'html.parser')
    lst = soup.find_all('li', class_='product_cat-risografiky')
    # lst = soup.select('li.product_cat-risografiky')
    
    in_stock = filter(fltr, lst)
    
    for item in in_stock:
        print(item)
     

    Комментарии:

    1. я не понимаю, как работает item[‘class’], откуда он знает, что такое класс items ?

    2. Это метод тега bs4, который возвращает имена классов, связанные с тегом. Вы знаете, что будет хотя бы один класс, поскольку для извлечения списка тегов использовался класс.