@twopercent

Как мне правильно использовать «try-except-finally»?

У меня есть парсер, который получает информацию с сайта и распределяет ее по разным директориям. В приведенном ниже блоке представлена одна из 6 функций. Некоторые из них работают как Selenium /Webdriver, другие как BeautifulSoup. Каждая такая функция заключена в блок "try-except" или "try-except-finally". В одном из элементов при работе скрипта возникает ошибка из-за неправильного имени каталога (оно содержит "/"). Я ожидаю, что в случае возникновения каких-либо проблем, должен сработать Except, вывести сообщение об ошибке и вернуть "None". Однако этого не происходит: Python выдает ошибку File "/home/twopercent/Projects/Parse/project/triya/main.py", line 213, in card_info os.mkdir(item_directory) FileNotFoundError: [Errno 2] No such file or directory and interrupts the program. Что я делаю не так? Почему не срабатывает "Try-Except-Finally"?

def card_info(url_list, directory):
    useragent = UserAgent()
    # options
    options = webdriver.FirefoxOptions()

    # change useragent
    options.set_preference('general.useragent.override', useragent.random)
    options.headless = True

    driver = webdriver.Firefox(
        executable_path='/home/twopercent/Projects/Parse/Firefox_driver/geckodriver',
        options=options
    )

    try:
        between_dict = {}
        result_dict = []
        counter = 0
        for url in url_list:

            item_time_start = datetime.now()

            driver.get(url=url)
            driver.set_page_load_timeout(60)

            charact_dict = {}
            picture_dict = []

            item_name = driver.find_element(By.CLASS_NAME, 'header-block').find_element(By.TAG_NAME, 'h1').text
            item_price = driver.find_element(By.CLASS_NAME, 'current-price').text
            driver.find_element(By.CLASS_NAME, 'description-block').find_element(By.CLASS_NAME,
                                                                                 'show-more-button').click()

            charact_sections = driver.find_element(By.CLASS_NAME, 'description-block').find_elements(By.CLASS_NAME,
                                                                                                     'prop-group')
            for item in charact_sections:
                name_sect = item.find_element(By.TAG_NAME, 'header').text
                data_char_dict = {}
                data_char_block = item.find_elements(By.CLASS_NAME, 'prop')
                for datas in data_char_block:
                    data_name = datas.find_element(By.CLASS_NAME, 'name').text
                    data_value = datas.find_elements(By.TAG_NAME, 'span')[2].text
                    data_char_dict[data_name] = data_value
                charact_dict[name_sect] = data_char_dict

            picture_block = driver.find_element(By.CLASS_NAME, 'swiper-container-thumbs')
            picture_list = picture_block.find_elements(By.CLASS_NAME, '__picture')

            item_directory = f'{directory}/{item_name}'
            if not os.path.exists(item_directory):
                os.mkdir(item_directory)

            counter_photo = 1

            for item in picture_list:
                pict_href = ('https://www.triya.ru' + item.find_element(By.TAG_NAME, 'source').get_attribute(
                    'srcset')).replace('320x180', 'original')
                pict_href = pict_href.split()[0]

                # get_photo(pict_href, item_directory, counter_photo)

                counter_photo += 1
                picture_dict.append(pict_href)

            between_dict['Наименование'] = item_name
            between_dict['Цена'] = item_price
            between_dict['Характеристики'] = charact_dict
            between_dict['Ссылки на картинки'] = picture_dict

            result_dict.append(between_dict)

            between_dict = {}

            item_time_total = datetime.now() - item_time_start

            counter += 1

            print(f'{item_name} и {len(picture_list)} фоток сохранено за {item_time_total} секунд! Выполнено {counter} из {len(url_list)} штук в папке')

        return result_dict

    
    except Exception as ex:
        errors_log(ex, f'card_info, category_list: {url}, item: {url_list}')
        print(('#' * 15) + f' error {ex} ' + ('#') * 15)
        return None
    
    finally:
        driver.close()
        time.sleep(1)
        driver.quit()
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
1.Создавать каталоги подобным образом нельзя. Нужно сперва родительский, затем дочерний.
2.Одно, притом общее исключение, на портянку кода это мощно. Покрывать исключениями нужно каждый участок кода, который может в теории сломаться. Притом обрабатывать исключения нужно в порядке от наиболее конкретного к наиболее общему.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы