【问题标题】:Web-scraping (the class name changes)网页抓取(类名更改)
【发布时间】:2020-03-16 11:47:15
【问题描述】:

我正在使用 selenium 为我的项目下载一些图像!

为了下载图片,我使用以下命令行:

# 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”更改为“main-lazy”。有没有办法通过代码来做到这一点。

我正在寻找一种方法来告诉代码要么找到“main-lazy”的类名就是“main”的类名不可用!

【问题讨论】:

  • 您可以先尝试获取“main”类。如果不存在,请尝试“main-lazy”。

标签: python selenium lazy-loading webdriverwait classname


【解决方案1】:

为什么不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')

【讨论】:

    【解决方案2】:

    如果只有两个变体是“main”和“main-lazy”,那么您可以尝试使用:

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

    抱歉,这是 C# 变体,但我相信您可以找出 Python 的等价物。

    【讨论】:

      【解决方案3】:

      你可以使用 css 或语法的

      image_lm = prd.find_element_by_css_selector('.main, .main-lazy')
      

      【讨论】:

        【解决方案4】:

        ClassName as ma​​in-lazy 表示元素是通过 加载的。在这种情况下,您必须诱导 WebDriverWait 并且您可以使用 通过 lambda 表达式对两个元素进行组合检查,如下所示:

        • 使用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_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 two xpath tests in one找到相关讨论

        【讨论】:

          猜你喜欢
          • 2016-03-22
          • 2020-06-18
          • 2019-07-15
          • 1970-01-01
          • 2020-03-19
          • 2022-01-14
          • 2013-07-15
          • 2019-07-26
          相关资源
          最近更新 更多