Помогите понять в чем ошибка 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>Чтобы подобрать необходимое оборудование и получить консультацию по 
        работе&nbsp;</span><span>сканирования штрих-кодов,&nbsp;</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, Деловые Линии, СПСР, ПЭК, СДЭК или предложить свой вариант. 
        Стоимость рассчитывается индивидуально, зависит от веса и пункта назначения.&nbsp;Доставка до транспортной 
        компании - 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 календарных 
        дней (зависит от банка).&nbsp;</p> <p style="text-align: justify;">Юридическим лицам следует направить письмо 
        (оригинал) на наш адрес. В нем на фирменном бланке надо указать причину возврата и все необходимые реквизиты. 
        Деньги вернутся в течение 14 банковских дней после получения письма.</p> <p><br /></p> <p style="text-align: 
        justify;"><span style="font-size: 14px;"><span>Теги:</span><span>&nbsp;</span><span style="font-size: 
        12px;"><a href="https://labeleco.ru/products/category/makrirovka-ready" title="МАРКИРОВКА товаров и услуг в 
        Краснодаре">МАРКИРОВКА ТОВАРА</a>,&nbsp;<a href="https://labeleco.ru/" title="Все для штрих-кода в 
        Краснодаре">ВСЕ ДЛЯ ШТРИХ-КОДА</a>,&nbsp;<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 Гражданского кодекса Российской Федерации.&nbsp;</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()


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