Ошибка в цикле при парсинге python, не могу понять причину

Рейтинг: 0Ответов: 1Опубликовано: 25.05.2023
import requests
from bs4 import BeautifulSoup
import time
import csv  


def get_data():
    url = "https://www.tvoyaapteka.ru/catalog/lekarstvennye-preparaty/?sort_by=NAME&sort_order=asc&only-available=Y"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
    }
    r = requests.get(url=url, headers=headers)
    soup = BeautifulSoup(r.text, "lxml")
    tovars = soup.findAll("div", class_="item t_r_sh clearfix relative")
    data = []
    for tovar in tovars:
        name = tovar.find("div", class_="name_box_inner").find("h3").text
        price = tovar.find("div", class_="price_2 hidden-spp-store").text

        data.append([name, price])

        with open("C:/Users/SERGEY/PycharmProjects/pythonProject1/СРАВНЕНИЕ/Тест7.csv", "a", encoding='utf-8-sig', newline='') as f:
            writer = csv.writer(f, delimiter=';')
            writer.writerow(('Название', 'Цена'))
            writer.writerows(data)

        print(data)

Почему-то в цикле у меня находятся и записываются в файл несколько одних и тех же значений и я не могу понять в чём причина. Я только учусь, поэтому прошу не кидаться камнями и не отправлять дальше учить матчасть))

Ответы

▲ 1Принят

Вынесите открытие файла и создание csv.writer за пределы цикла. Файл будет открыт только один раз, и данные будут записываться последовательно без повторений.

import requests
from bs4 import BeautifulSoup
import csv


def get_data():
    url = "https://www.tvoyaapteka.ru/catalog/lekarstvennye-preparaty/?sort_by=NAME&sort_order=asc&only-available=Y"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
    }
    r = requests.get(url=url, headers=headers)
    soup = BeautifulSoup(r.text, "lxml")
    tovars = soup.findAll("div", class_="item t_r_sh clearfix relative")
    data = []

    for tovar in tovars:
        name = tovar.find("div", class_="name_box_inner").find("h3").text
        price = tovar.find("div", class_="price_2 hidden-spp-store").text
        data.append([name, price])

    with open("C:/Users/SERGEY/PycharmProjects/pythonProject1/СРАВНЕНИЕ/Тест7.csv", "a", encoding='utf-8-sig', newline='') as f:
        writer = csv.writer(f, delimiter=';')
        writer.writerow(('Название', 'Цена'))
        writer.writerows(data)

    print(data)