网页抓取(类名更改)
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 main-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找到相关讨论
【讨论】:
以上是关于网页抓取(类名更改)的主要内容,如果未能解决你的问题,请参考以下文章