Не получается добавить элементы из одного словаря в другой
Я хочу добавить элемент из одного словаря в другой, решил воспользоваться командой update, но почему-то вылезла ошибка: 'list' object has no attribute 'update'
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_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')
for item in i:
proba = item.find('ul', class_='menu').get_text(strip=True)
for item2 in items:
stranica = item2.find('a', class_='b-products__text').get('href')
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('р', '.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('Артикул: ',''),
"proba": proba,
})
svarka2 = []
for item in items:
svarka2.append({
"stranica": item.find('a', class_='b-products__text').get('href')
})
svarka.update(svarka2)
return svarka
def save_file(svarka, path):
with open(path, 'w', newline='') as file:
writer = csv.writer(file, delimiter=';')
writer.writerow(['Название', 'Описание', 'Лейбел', 'Цена', 'Картинка', 'Артикул', 'Ссылка', 'Проба', 'Большое описание'])
global item
for item in svarka:
writer.writerow((item.get("title"), item.get("text"), item.get("label"), item.get("price"), item.get("image"), item.get("articul"), item.get("stranica"), item.get("proba"), 'rub'))
def parse():
URL = input('Введите URL: ')
URL = URL.strip()
html = get_html(URL)
if html.status_code == 200:
svarka = get_content(html.text)
print(svarka)
else:
print('Error')
parse()
Ответы (3 шт):
Автор решения: Эникейщик
→ Ссылка
Потому что там не словарь, а список. У словаря фигурные скобки
svarka2 ={}
Автор решения: Данил Егорин
→ Ссылка
'list' object has no attribute 'update' - эта ошибка говорит о том, что вы используете вместо dict(словарь) list(список)
списки вызываются в квадратных скобках [], словари в фигурных {}.
Наверное сработает замена на тот же append, но я не уверен:
svarka.append(svarka2)
Автор решения: Богдан Мусихин
→ Ссылка
Сейчас столкнулся с другой проблемой при добавлении списка svarka2, он не добавляет элементы svarka2 в svarka
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')
for item in i:
proba = item.find('ul', class_='menu').get_text(strip=True)
for item2 in items:
stranica = item2.find('a', class_='b-products__text').get('href')
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('р', '.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('Артикул: ',''),
"proba": proba,
})
svarka2 = []
for item in items:
svarka2.append({
"stranica": item.find('a', class_='b-products__text').get('href')
})
svarka.extend(svarka2)
return svarka
def perehod(svarka):
svarka2 = svarka["title"]
return svarka2
def save_file(svarka, path):
with open(path, 'w', newline='') as file:
writer = csv.writer(file, delimiter=';')
writer.writerow(['Название', 'Описание', 'Лейбел', 'Цена', 'Картинка', 'Артикул', 'Ссылка', 'Проба', 'Большое описание'])
global item
for item in svarka:
writer.writerow((item.get("title"), item.get("text"), item.get("label"), item.get("price"), item.get("image"), item.get("articul"), item.get("stranica"), item.get("proba"), 'rub'))
def djfdk ():
save_file(svarka, FILE)
print(f'Получено {len(svarka)} сварочных аппаратов')
os.startfile(FILE)
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()