网页抓取(类名更改)

Posted

技术标签:

【中文标题】网页抓取(类名更改)【英文标题】: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”。 【参考方案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 表示元素是通过lazy-loading 加载的。在这种情况下,您必须诱导 WebDriverWait 并且您可以使用 xpath 通过 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-selectors 对这两个元素进行组合检查,如下所示:

使用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找到相关讨论

【讨论】:

以上是关于网页抓取(类名更改)的主要内容,如果未能解决你的问题,请参考以下文章

简单的网页更改或按钮删除和抓取的数据是无用的

网页抓取和查找元素

使用 R 从网页中抓取可下载文件的链接地址?

请教网页里的特定数据怎么抓取?

如何抓取网页中的动态数据

使用PHP的cURL库进行网页抓取