Парсинг Selenium+ bs4 Python. Ошибка selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

Рейтинг: 0Ответов: 1Опубликовано: 01.08.2023

Я новичок в парсинге. Есть задача: проверить, имеющиеся УНП компаний (файл csv, который переводится в список по ходу кода) по Единому государственному регистру (сайт: https://egr.gov.by/egrn/index.jsp?content=Find) и узнать актуальное состояние (Действующее, в ликвидации и т.д), выгрузить его в виде файла. Вот мой код

from selenium import webdriver
import time
from bs4 import BeautifulSoup
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
import pandas as pd
import csv
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

CSV = 'Статус'

def get_content(browser):
    soup = BeautifulSoup(browser.page_source, 'lxml')
    orgs = soup.findAll('table', class_='mb-6')
    cards = []

    for org in orgs:
        cards.append(
            {
                    'unp': org.find_all('td')[5].get_text(),
                    'state': org.find_all('td')[1].get_text()
            }
        )

    return cards

def save_doc(orgs, path):
    with open(path, 'w', newline='') as file:
        writer = csv.writer(file, delimiter=';')
        writer.writerow(['Статус', 'УНП'])
        for org in orgs:
            writer.writerow([org['unp'], org['state']])

def parser():
    i = 0
    browser = webdriver.Chrome()
    browser.get("https://egr.gov.by/egrn/index.jsp?content=Find")

    data = pd.read_csv("C:\\Users\\Наташа\\UNP.csv")
    print(data)
    UNP_spisok = data['Код налогоплательщика'].tolist()
    print(UNP_spisok)

    cards = []

    while i<len(UNP_spisok):
        print("Парсим UNP: ", i,  UNP_spisok[i])
        search_input = browser.find_element(By.NAME, "name")
        WebDriverWait(browser, 20).until(
            EC.presence_of_element_located((By.NAME, "name")))
        for k in range(0, 9):
            search_input.send_keys(Keys.BACKSPACE)

        search_input.send_keys(str(UNP_spisok[i]) +"\n")

        cards.extend(get_content(browser))
        save_doc(cards, CSV)

        i += 1
        time.sleep(1)
    print("Парсинг закончен")

    browser.close()

parser()

При запуске кода, возникает ошибка (через разное количество выполненных циклов):

Traceback (most recent call last):
  File "C:\Users\Наташа\PycharmProjects\pythonParsing\Poisk.py", line 72, in <module>
  File "C:\Users\Наташа\PycharmProjects\pythonParsing\Poisk.py", line 59, in parser
    save_doc(cards, CSV)
  File "C:\Users\Наташа\PycharmProjects\pythonParsing\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 231, in send_keys
    self._execute(
  File "C:\Users\Наташа\PycharmProjects\pythonParsing\venv\lib\site-packages\selenium\webdriver\remote\webelement.py", line 395, in _execute
    return self._parent.execute(command, params)
  File "C:\Users\Наташа\PycharmProjects\pythonParsing\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 345, in execute
    self.error_handler.check_response(response)
  File "C:\Users\Наташа\PycharmProjects\pythonParsing\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 229, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
  (Session info: chrome=115.0.5790.110)
Stacktrace:
Backtrace:
    GetHandleVerifier [0x00007FF7C94C3E62+57250]
    (No symbol) [0x00007FF7C943BC02]
    (No symbol) [0x00007FF7C930DF6D]
    (No symbol) [0x00007FF7C9342BD4]
    (No symbol) [0x00007FF7C9341F94]
    (No symbol) [0x00007FF7C93667AA]
    (No symbol) [0x00007FF7C933E536]
    (No symbol) [0x00007FF7C93669C0]
    (No symbol) [0x00007FF7C937E312]
    (No symbol) [0x00007FF7C9366583]
    (No symbol) [0x00007FF7C933CC71]
    (No symbol) [0x00007FF7C933DE54]
    GetHandleVerifier [0x00007FF7C9774CF2+2879026]
    GetHandleVerifier [0x00007FF7C97C6F30+3215472]
    GetHandleVerifier [0x00007FF7C97BFD4F+3186319]
    GetHandleVerifier [0x00007FF7C9555505+652869]
    (No symbol) [0x00007FF7C9447518]
    (No symbol) [0x00007FF7C94435F4]
    (No symbol) [0x00007FF7C94436EC]
    (No symbol) [0x00007FF7C94338E3]
    BaseThreadInitThunk [0x00007FFC1F2F7614+20]
    RtlUserThreadStart [0x00007FFC1FC026B1+33]

Я уже пыталась выставлять и time.sleep на 5-20 с в нескольких местах (после удаления уже проверенного УНП из поля и перед поиском информации из таблицы), пробовала применять WebDriverWait, но тут есть проблема. Иногда ошибка возникает из-за того, что таблица с результатом не успевает загрузиться на сайте. Если выставить WebDriverWait перед стадией считывания информации с этой таблицы, то программа завершится при первом УНП, которое не будет найдено на данном сайте.

Кусок кода разработчика для таблицы Кусок кода разработчика для таблицы

Кусок кода разработчика в случае, когда информации нет Кусок кода разработчика в случае, когда информации нет

В связи с этим вопрос: может кто-нибудь сталкивался с ситуацией, когда нужно применить WebDriverWait и есть два возможных элемента, которые могут появится? Буду очень благодарна за ответ, уже всю голову себе сломала. Заранее, Спасибо!

Ответы

▲ 0Принят

Система time.sleep не всегда оправдана. Обычно стараются заменить такой конструкцией:

WebDriverWait(driver, 15).until(EC.element_to_be_clickable(
                (By.XPATH, "/html/body/a/span"))).click()

ну там на вкус и цвет XPATH или же By.class и т.д. В зависимости от ситуации.