Извлечение элементов с пользовательскими атрибутами HTML

#python-3.x #selenium #xpath #scrapy #css-selectors

#python-3.x #selenium #xpath #scrapy #css-селекторы

Вопрос:

У меня есть следующий веб-сайт:https://www.kvk.nl/handelsregister/publicaties / , где я хотел бы получить ссылку для входа с помощью Selenium, Scrapy и Python. Итак, для соответствующей функции у меня есть следующий код:

 def start_requests(self):
        self.driver = webdriver.Chrome(executable_path=os.path.join(os.getcwd(), "Drivers", "chromedriver.exe"))
        self.driver.get(self.initial_url)
        test = access_page_wait.until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, 'a[data-ui-test-class="linkCard_toegangscode"]')))
    if test.is_displayed():
        print(" 1")
    else:
        print("-1")
  

Однако, похоже, это не работает, поскольку он просто ждет 15 секунд, а затем останавливается. Он никогда не достигнет 1 или -1.

Теперь мой вопрос в том, как мы можем указать selenium на правильный элемент. Похоже, это также не работает с использованием XPATH find_elements_by_xpath("//a[@data-ui-test-class='linkCard_toegangscode']") .

Должен ли я использовать другой подход к выбору, и если да, то какой?

Комментарии:

1. вы пробовали мой ответ?

2. Рассмотрите возможность использования github.com/clemfromspace/scrapy-selenium смешивать Scrapy и Selenium, чтобы предотвратить другие проблемы, с которыми вы можете столкнуться в будущем.

3. На самом деле я хочу, чтобы Selenium только зарегистрировал меня и получил страницу, стоящую за аутентификацией. Передаю заголовки аутентификации для входа / сеанса моему Scrapy spider, а затем я продолжаю выполнять очистку. Я считаю, что Scrapy работает немного быстрее, поскольку для него не требуется браузер.

Ответ №1:

Потому что есть фрейм, который мешает вам получить доступ к элементу.Переключитесь на iframe, а затем получите доступ к элементу.

 from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
import os
driver = webdriver.Chrome(executable_path=os.path.join(os.getcwd(), "Drivers", "chromedriver.exe"))
driver.get("https://www.kvk.nl/handelsregister/publicaties/")
driver.switch_to.frame(0)
test=WebDriverWait(driver,10).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, 'a[data-ui-test-class="linkCard_toegangscode"]')))
if test.is_displayed():
    print(" 1")
else:
    print("-1")
  

Попробуйте приведенный выше код.Он должен печатать то, что вам нужно.