Пытаюсь спарсить сайт, но выводит ошибку KeyError: 'proba'

При выполнении программы выводит ошибку: KeyError: 'proba' Не могу понять в чем проблема, пожалуйста помогите

import requests
from bs4 import BeautifulSoup
import csv
import os

URL = 'https://ptk-svarka.ru/catalog/apparaty-poluavtomaticheskoy-svarki-mig'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', 'accept': '*/*'}
FILE = 'svarka.csv'



def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r

def get_pages_count(html):
    soup = BeautifulSoup(html, 'html.parser')
    pagination = soup.find_all('span', class_='mhide')
    if pagination:
        return int(pagination[-1].get_text())
    else:
        return 1

def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('div', class_='b-grid__item js-product-item')
    i = soup.find_all('div', class_='b-navbar')
    svarka = []
    for item in items:
        svarka.append({
            "title": item.find('div', class_='b-products__title').get_text(strip=True),
            "text": item.find('a', class_='b-products__text').get_text(strip=True),
            "label": item.find('ul', class_='b-products__labels').get_text(strip=True).replace(':', ':  '),
            "price": item.find('span', class_='b-products__price').find_next('span').get_text(strip=True).replace(' ', '').replace('р', '').replace('\xa0', '.00'),
            "image": item.find('img', class_='lozad').get('data-src'),
            "articul": item.find('div', class_='b-products__meta').get_text(strip=True).replace('Артикул: ',''),
            "stranica": item.find('a', class_='b-products__text').get('href'),
        })
    for item in i:
        svarka.append({
            "proba": item.find('ul', class_='menu').get_text(strip=True)
            })
    return svarka



def save_file(svarka, path):
    with open(path, 'w', newline='') as file:
        writer = csv.writer(file, delimiter=';')
        writer.writerow(['Название', 'Описание', 'Лейбел', 'Цена', 'Картинка', 'Артикул', 'Ссылка', 'proba'])
        global item
        for item in svarka:
            writer.writerow([item["title"], item["text"], item["label"], item["price"], item["image"], item["articul"], item["stranica"], item["proba"]])

def djfdk ():
    for item2 in i:
        writer.writerow([item2['proba']])


def parse():
    URL = input('Введите URL: ')
    URL = URL.strip()
    html = get_html(URL)
    if html.status_code == 200:
        svarka = get_content(html.text)
        save_file(svarka, FILE)
        print(f'Получено {len(svarka)} сварочных аппаратов')
        os.startfile(FILE)
    else:
        print('Error')


parse()

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

Автор решения: Nobody

Я догадываюсь, что после сбора данных с сайта. вы получаете примерно такой список

svarka = [
{"title": value_1,
"text": value_2,
"label": value_3,
"price": value_4,
"image": value_5,
"articul": value_6,
"stranica": value_7}, 
{"title": value_11,
"text": value_22,
"label": value_33,
"price": value_44,
"image": value_55,
"articul": value_66,
"stranica": value_77},
{"proba": value_100},
{"proba": value_200}]

В функции save_file() вы проходите поэлементно по списку svarka (элемент = словарь в вашем списке) и записываете данные элемента в файл, однако из-за того как вы организовали ваш список у вас вылезает данная ошибка, ведь взяв первый элемент списка (и дальнейшие) в вашем словаре нет ключа "proba"

вам надо переписать логику функции get_content() так чтобы словарь с ключом "proba" добавлялся к существующим словарям, а не записывался отдельно можно сделать так:

for index, item in enumerate(items):  # изменено здесь
        svarka.append({
            "title": item.find('div', class_='b-products__title').get_text(strip=True),
            "text": item.find('a', class_='b-products__text').get_text(strip=True),
            "label": item.find('ul', class_='b-products__labels').get_text(strip=True).replace(':', ':  '),
            "price": item.find('span', class_='b-products__price').find_next('span').get_text(strip=True).replace(' ', '').replace('р', '').replace('\xa0', '.00'),
            "image": item.find('img', class_='lozad').get('data-src'),
            "articul": item.find('div', class_='b-products__meta').get_text(strip=True).replace('Артикул: ',''),
            "stranica": item.find('a', class_='b-products__text').get('href'),
            "proba": i[index].find('ul', class_='menu').get_text(strip=True),  # добавлена эта строка
        })
return svarka
→ Ссылка
Автор решения: Богдан Мусихин

А вопрос такой, является ли такая структура правильной?

for item in i:
        proba = item.find('ul', class_='menu').get_text(strip=True)
for item in items:
        svarka.append({
            "title": item.find('div', class_='b-products__title').get_text(strip=True),
            "text": item.find('a', class_='b-products__text').get_text(strip=True),
            "label": item.find('ul', class_='b-products__labels').get_text(strip=True).replace(':', ': '),
            "price": item.find('span', class_='b-products__price').find_next('span').get_text(strip=True).replace(' ', '').replace('р', '.00').replace('\xa0', ''),
            "image": item.find('img', class_='lozad').get('data-src'),
            "articul": item.find('div', class_='b-products__meta').get_text(strip=True).replace('Артикул: ',''),
            "stranica": item.find('a', class_='b-products__text').get('href'),
            "proba": proba,
        })
    return svarka
→ Ссылка