Как использовать условный оператор, если позиция отсутствует?

Рейтинг: 0Ответов: 2Опубликовано: 08.05.2023

ошибка

ошибки

import requests
from bs4 import BeautifulSoup
import csv
import openpyxl
import pandas as pd
import xlsxwriter
import xlrd
from openpyxl import load_workbook
import numpy as np
from csv import writer
from lxml import html

headers = {
    'accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
    'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 OPR/94.0.0.0 (Edition Yx 02)'

}

import xlsxwriter
from bs4 import BeautifulSoup

headers = {
    'accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
    'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 '
                  'Safari/537.36 OPR/94.0.0.0 (Edition Yx 02)'

}

url = 'https://www.divan.ru/category/krovati/'

response = requests.get(url)

soup = BeautifulSoup(response.text, 'lxml')  # создаем суп

pagination = soup.find('div', class_='dqBvL').find_all('a')
pages = int(pagination[-2].text)

print(f'Всего страниц: {pages}')

# Номер текущего товара
block_no = 1

data = []

for page in range(1, pages + 1):
    page_response = requests.get(url + f'page-{page}', headers=headers)
    page_soup = BeautifulSoup(page_response.text, 'lxml')
    # Находим все блоки с товаром
    blocks = page_soup.find('div', class_='Lei8X').find_all('div', class_='LlPhw')
    price = page_soup.find('div', class_='Lei8X').find_all('div', class_='LlPhw')

    # Проходимся по ним
    for block in blocks:

        # Ищем наименование
        title = block.find('a', {'class': 'ImmXq dpmhZ b8BqN ProductName'}).text.strip()
        price = block.find('span', {'class': 'Zq2dF F9ye5 KIkOH'}).text.strip()
       
        data.append([block_no, title, price])
        block_no += 1
        print(title, price)

Я собираю информацию с сайта "Наименование" и "Цена". На последних страницах товар присутствует, но нет цены, написано "товар отсутствует". Там где товар отсутствует нет тега span, но появляется тег div class_= gWTeQ zR619, где "товар отсутствует". Как сделать, чтобы при парсинге, если цена отсутствует, он передавал тег - "товар отсутствует".

Ответы

▲ 2

Открыв сайт на последней странице, мы увидим что плашки "Товар отсутствует" появляются уже после загрузки страницы значит requests не поможет. Нужно использовать selenium Вот исправленный код переписанный на selenium (Нужно установить selenium командой pip install selenium и webdriver_manager командой pip install webdriver_manager):

from bs4 import BeautifulSoup
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService

url = 'https://www.divan.ru/category/krovati/'

# Создаем новый браузер
options = webdriver.ChromeOptions()
options.add_argument("--headless")

service = ChromeService(executable_path=ChromeDriverManager().install())

browser = webdriver.Chrome(options=options, service=service)

browser.get(url)  # Открываем страницу

soup = BeautifulSoup(browser.page_source, 'lxml')  # создаем суп

pagination = soup.find('div', class_='dqBvL').find_all('a')
pages = int(pagination[-2].text)

print(f'Всего страниц: {pages}')

# Номер текущего товара
block_no = 1

data = []

for page in range(1, pages + 1):
    browser.get(url + f'page-{page}')
    page_soup = BeautifulSoup(browser.page_source, 'lxml')
    # Находим все блоки с товаром
    blocks = page_soup.find('div', class_='Lei8X').find_all('div', class_='LlPhw')
    price = page_soup.find('div', class_='Lei8X').find_all('div', class_='LlPhw')

    # Проходимся по ним
    for block in blocks:
        # Ищем наименование
        title = block.find('a', {'class': 'ImmXq dpmhZ b8BqN ProductName'}).text.strip()
        if block.find('div', {'class': 'gWTeQ zR619'}) is not None:
            price = 'Товар отсутствует'  # Если есть плашка нет в наличии
        else:
            price = block.find('span', {'class': 'Zq2dF F9ye5 KIkOH'}).text.strip()

        data.append([block_no, title, price])
        block_no += 1
        print(title, price)

browser.quit()  # Закрываем браузер

with xlsxwriter.Workbook('m.xlsx') as workbook:
    worksheet = workbook.add_worksheet()

    content = ["N", "Наименование", "Цена"]

    worksheet.write_row(0, 0, content)

    for index, row in enumerate(data, start=1):
        worksheet.write_row(index, 0, row)

    worksheet.autofit()  # Подбираем размер ячеек (Необязательно, но приятно)


▲ 0
tag = soup.find('div', {'class': 'my-class'})

if tag is not None:
    # выполнение кода, если тег найден
else:
    # выполнение кода, если тег не найден