Помогите понять в чем ошибка TypeError: 'NoneType' object is not subscriptable
Возникает ошибка на разных стадиях выполнения кода:
Traceback (most recent call last):
File "C:\Users\Manager\PycharmProjects\parser.py\main.py", line 192, in <module>
parser()
File "C:\Users\Manager\PycharmProjects\parser.py\main.py", line 184, in parser
info_list.extend(parser_page_product(html.text))
File "C:\Users\Manager\PycharmProjects\parser.py\main.py", line 64, in parser_page_product
title_reg = re.search(REG_TIT, title_text)[0]
TypeError: 'NoneType' object is not subscriptable
Вот код:
import csv
import re
import time
import requests
from bs4 import BeautifulSoup
from tqdm import tqdm
import transliterate
REG = r'([A-Z0-9]{3,}-[\w]{2}-[\w0-9]{3,})|([A-Z0-9]{3,}-[\w0-9]{3,})|([A-Z0-9]{3,}-[\w0-9]{2})'
REG_TIT = r'([a-zA-Z]+ [a-zA-Z]+ [A-Z0-9]{3,}-[\w]{2}-[\w0-9]{3,})|([a-zA-Z]+ [a-zA-Z]+ [A-Z0-9]{3,}-[\w0-9]{3,' \
r'})|([a-zA-Z]+ [a-zA-Z]+ [A-Z0-9]{3,}-[\w0-9]{2})'
HOST = 'https://interid.ru'
# URL = 'https://interid.ru/scanery-shtrih-kodov'
# CSV = 'scanner.csv'
# PARAMS = {'manufacturer_id': 13, 'param890': 648}
HEADERS = {
'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.9',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/87.0.4280.88 Safari/537.36 '
}
def get_html(url, params=''):
req = requests.get(url, headers=HEADERS, params=params)
return req
# получаем url конкретной страницы продукта
def get_url(html):
soup = BeautifulSoup(html, 'lxml')
url = soup.find_all('div', class_='product')
urls = []
for i in url:
urls.append({
'url_page': HOST + i.find('div', class_='c-title').find('a').get('href')
})
return urls
# Собираем нужные данные с конкретной страницы продукта
def parser_page_product(html_page):
soup = BeautifulSoup(html_page, 'lxml')
info_product = soup.find('div', class_='c-contents')
info_product.encode('cp1251')
params = []
params_list = soup.find('div', class_='c-tabs-contents-params').find_all('div', class_='param')
for i in params_list:
params.append({
i.find('div', class_='param-name').get_text(strip=True): i.find('div', class_='param-value').get_text(
strip=True)
})
table_html = ''
for i in params:
for key, value in i.items():
table_html = table_html + ('<tr><td>' + str(key) + '</td><td>' + str(value) + '</td></tr>')
title_text = info_product.find('h1', class_='c-header-product-title').find('span').get_text(strip=True)
title_reg = re.search(REG_TIT, title_text)[0]
title_reg_text = 'Сканер штрих-кода ' + title_reg
# print(title_reg_text)
info_product_list = [{
# название
'title': 'Сканер штрих-кода' + title_reg_text,
# артикул, полчаем через регулярное выражение
'article': re.search(REG, title_text)[0],
# цена
'price': info_product.find('div', class_='price').find('span', class_='price-value').get_text(strip=True),
# ссылка на изображение
'url_img': info_product.find('a', class_='c-images-list-item is-active').get('href'),
# короткое описание
'short_desc': info_product.find('div', class_='c-description').find('p').get_text(strip=True),
# характеристики
'params': '''<p><span style="color: #008000; font-weight: bold;">Преимущества покупки сканера штрих-кода ''' +
title_reg_text +
''' в LABELECO.RU:</span></p> <ul> <li>Профессиональная консультация по технических
вопросам выбранного оборудования;</li> <li>Широкий модельный ряд и необходимые аксессуары, поможем подобрать
оптимальные комплекты оборудования;</li> <li>Удобное расположение склада в Краснодаре, доставка по городу и
РФ (подробности уточняйте по телефону).</li> <li>На товар <span style="font-weight: bold;">''' +
title_reg_text +
'''</span> предоставляется официальная гарантия.</li> </ul> <p><br /></p> <p
style="text-align: justify;"><span>Чтобы подобрать необходимое оборудование и получить консультацию по
работе </span><span>сканирования штрих-кодов, </span><span>свяжитесь с нашими менеджерами с 9.00 до
18.00 часов, в рабочие дни, по телефонам :</span></p> <p style="text-align: justify;"><span>+7(988)246-34-14,
+7(861)944-34-14, +7(861)945-34-14</span></p> <p><br /></p> <p style="text-align: justify;"><span
style="color: #000000; font-weight: bold;">Доставка:</span></p> <p style="text-align: justify;">Для
самовывоза надо заранее согласовать с менеджером заказ и определить, в какие сроки товар будет доставлен в
пункт самовывоза. Это бесплатно! Забрать оплаченный заказ можно с 09:30 до 18:00 по будням. При себе
необходимо иметь паспорт, юр. лицам - дополнительно потребуется доверенность М2 или печать организации.</p>
<p style="text-align: justify;"><span style="text-align: justify;">Наш адрес: Краснодар, ул. Таманская,
д.180, левое крыло, офис 103/105.</span></p> <p><br /></p> <p style="text-align: justify;"><span
style="color: #000000; font-weight: bold;">Курьерская доставка возможна для заказов:</span></p> <ul
style="text-align: justify;"> <li>весом не более 50 килограмм - до подъезда (подъем на этаж не включен): 300
руб в города Краснодар.</li> <li>стоимостью более 60 000 рублей: по гор.Краснодар бесплатно.</li> </ul>
<p>Доставка по России осуществляется 2 раза в неделю по вторникам и четвергам, с 12:00 до 17:00 часов. Клиент
может выбрать любую из компаний: DHL, EMS, Деловые Линии, СПСР, ПЭК, СДЭК или предложить свой вариант.
Стоимость рассчитывается индивидуально, зависит от веса и пункта назначения. Доставка до транспортной
компании - 300 рублей, при стоимости заказа выше 60 000 рублей - бесплатно. Оплата производится
непосредственно транспортным компаниям.<br /></p> <p style="text-align: justify;">За пределы РФ оборудование
не доставляем.</p> <p><br /></p> <p style="text-align: justify;"><span style="color: #000000; font-weight:
bold;">Гарантия</span></p> <p style="text-align: justify;">В случае, если в купленном товаре выявлены
недостатки, гарантийный ремонт осуществляется в авторизованных сервисных центрах. Туда можно обратиться
напрямую или посредством нашей компании.</p> <p style="text-align: justify;">Технически сложный товар без
выявленных недостатков не подлежит обмену и возврату. Если же недостатки выявлены, то вернуть или обменять
его возможно в течение 14 дней со дня покупки (передачи потребителю) на основании проверки качества или
проведенной экспертизы. Если недостатки выявлены по истечении этого срока, покупатель имеет право заявить о
необходимости устранить эти дефекты или уменьшить изначальную стоимость, а также возместить расходы по
устранению этих дефектов.</p> <p><br /></p> <p style="text-align: justify;"><span style="color:
#000000;"><span style="font-weight: bold;">Возврат денежных средств</span></span></p> <p style="text-align:
justify;">Частным лицам потребуется паспорт. Обратитесь в наш офис чтобы написать заявление. Возврат будет
сделан на карту, с которой производилась оплата. Поступление денег произойдет в срок от 1 до 30 календарных
дней (зависит от банка). </p> <p style="text-align: justify;">Юридическим лицам следует направить письмо
(оригинал) на наш адрес. В нем на фирменном бланке надо указать причину возврата и все необходимые реквизиты.
Деньги вернутся в течение 14 банковских дней после получения письма.</p> <p><br /></p> <p style="text-align:
justify;"><span style="font-size: 14px;"><span>Теги:</span><span> </span><span style="font-size:
12px;"><a href="https://labeleco.ru/products/category/makrirovka-ready" title="МАРКИРОВКА товаров и услуг в
Краснодаре">МАРКИРОВКА ТОВАРА</a>, <a href="https://labeleco.ru/" title="Все для штрих-кода в
Краснодаре">ВСЕ ДЛЯ ШТРИХ-КОДА</a>, <a target="_blank"
href="https://etiketka-eco.nethouse.ru/products/category/scanery-shtrih-koda" title="Купить сканеры
штрих-кода в Краснодаре ( правильное оборудование для профессионалов )" rel="noopener noreferrer">СКАНЕРЫ
ШТРИХ-КОДА</a></span></span></p> <p><br /></p> <p style="text-align: justify;"><span style="font-size:
12px;">Внешний вид товара и комплектация товаров может быть изменена производителем и не соответствовать
описанию на сайте. Вся представленная на сайте информация, касающаяся технических характеристик, наличия на
складе, стоимости товаров, носит информационный характер и ни при каких условиях не является публичной
офертой, определяемой положениями статьи 437 Гражданского кодекса Российской Федерации. </span><span
style="font-size: 12px;"><span>Администрация ресурса Labeleco оставляет за собой право вносить изменение в
содержание материалов этого сайта в любое время по собственному усмотрению. Вся информация об Labeleco и
третьих сторонах на этом сайте представлена в том виде, в котором она существует в распоряжении
Labeleco.</span></span></p>'''
}]
# p = ''' + '<br><table style="width: 65%; margin: 0 auto;" border="1" cellpadding="10" ''cellspacing="0"><tbody>' + table_html + '</tbody></table>''''
return info_product_list
# сохраняем данные в файл .csv
def save_doc(items, path):
description = ' Заказ и доставка в течении 3 дней. Подбор, консультация, демо зал на Таманской.'
title = ' купить в Краснодаре, оптимальная цена в магазине LABELECO.RU'
with open(path, 'w', encoding='cp1251', newline='', errors='ignore') as file:
writer = csv.writer(file, delimiter=';')
writer.writerow(['id', 'Артикул *', 'Название товара *', 'Стоимость товара *', 'Стоимость со скидкой',
'Раздел товара *', 'Товар в наличии *', 'Поставка под заказ *', 'Срок поставки (дни) *',
'Краткий текст', 'Текст полностью', 'Заголовок страницы (title)',
'Описание страницы (description)',
'Ключевые слова страницы (keywords)', 'ЧПУ страницы (slug)', 'С этим товаром покупают',
'Рекламные метки', 'Показывать на сайте *', 'Удалить *', 'Ед. измерения', 'Вес',
'Габариты, см',
'НДС', 'Передавать в Яндекс.Маркет'])
for item in items:
writer.writerow(['', item['article'], item['title'], item['price'], '', 'СКАНЕРЫ ШТРИХ-КОДА',
'0', '1', '15', item['short_desc'],
item['params'], item['title'] + title, item['title'] + description, item['title'],
transliterate.translit(item['title'].replace(' ', '_'), reversed=True),
'', '', '1', '0', 'шт', '', '', '', '1'])
# основной метод
def parser():
URL = 'https://interid.ru/scanery-shtrih-kodov'
CSV = 'scanner.csv'
PARAMS = {'manufacturer_id': 13, 'param890': 648}
info_list = []
html = get_html(URL, params=PARAMS)
if html.status_code == 200: # проверка статуса ответа сайта
print('Сайт доступен!\nПарсинг запущен:')
page = int(input('Укажите кол-во страниц для парсинга => ').strip())
# проходим по страницам каталога и получаем ссылку на отдельную страницу каждого товара
for page in range(1, page + 1):
html = get_html(URL + '/page/' + str(page), params=PARAMS)
print(f'Страница => {page}')
# перебираем словарь; добавляем прогрессбар
for i in tqdm(get_url(html.text)):
#time.sleep(3)
for key in i:
html = get_html(i[key])
info_list.extend(parser_page_product(html.text))
save_doc(info_list, CSV)
print('Парсинг окончен. Данные сохранены в файле ' + CSV)
else:
print('Ошибка! Неверная ссылка или сайт недоступен.')
parser()