Пытаюсь спарсить сайт, но выводит ошибку 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 шт):
Я догадываюсь, что после сбора данных с сайта. вы получаете примерно такой список
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