Веб-скрейпинг (изменение имени класса)

Я использую селен для загрузки некоторых изображений для моего проекта!

Для загрузки изображений я использую следующие командные строки:

# Finding elements of images by class name
image_lm = prd.find_element_by_class_name('main')

# The URL to the image
image_url = image_lm.get_attribute('src')

Затем, используя image_url, я загружаю изображения.

Проблема в том, что после нескольких попыток имя класса меняется на «main-lazy».

Я могу вручную изменить «основной» на «основной-ленивый». есть ли способ сделать это по коду.

Я ищу способ сообщить коду, который либо находит имя класса «main-lazy», либо имя класса «main» недоступно!


person Naik    schedule 20.11.2019    source источник
comment
Вы можете сначала попробовать получить класс main. Если его нет, попробуйте main-lazy.   -  person Code-Apprentice    schedule 20.11.2019


Ответы (4)


Почему не try/except ?

try:
   image_lm = prd.find_element_by_class_name('main')
except Exception as e:
   print("changing to main_lazy \n"+e)
   image_lm = prd.find_element_by_class_name('main_lazy')
person Vignesh SP    schedule 20.11.2019

Если единственными двумя вариантами являются «основной» и «основной-ленивый», вы можете попробовать использовать:

By.XPath("//[contains(@class,'main')]

Извините, это вариант C #, но я уверен, что вы можете найти эквивалент Python.

person ratsstack    schedule 20.11.2019

Вы можете использовать css или синтаксис

image_lm = prd.find_element_by_css_selector('.main, .main-lazy')
person QHarr    schedule 21.11.2019

ClassName как main-lazy указывает, что элементы загружаются через ленивая загрузка. В таких случаях вы должны вызвать WebDriverWait, и вы можете объединить проверку обоих элементов, используя xpath с помощью лямбда-выражения следующим образом:

  • Использование class_name 1:

    image_lm = WebDriverWait(driver, 20).until(lambda x: (x.find_element_by_class_name("main"), x.find_element_by_class_name("main-lazy")))
    
  • Использование class_name 2:

    image_lm = WebDriverWait(driver,20).until(lambda driver: driver.find_element(By.CLASS_NAME,"main") and driver.find_element(By.CLASS_NAME,"main-lazy"))
    

В качестве альтернативы вы можете объединить проверку обоих элементов, используя эквивалентную ссылку css-селекторы следующим образом:

  • Использование css_selector:

    image_lm = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, ".main, .main-lazy")))
    
  • Примечание. Вы должны добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Вы можете найти соответствующее обсуждение в selenium два теста xpath в одном

person DebanjanB    schedule 21.11.2019