Selenium 不会点击页面上的所有按钮

问题描述 投票:0回答:1

我一直在抓取此页面:https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen

如图所示,该页面在一个捆绑包中显示了多个公寓,我想单击按钮(用红色椭圆标记)以显示该捆绑包的所有公寓。

我的代码扩展了第一个包,但没有扩展其他包(某些页面可能有 1 个、5 个或没有)。我使用的代码如下:

while True:
        try:
            show_more_units = driver.find_element(By.XPATH, '//*[@id="result-p-149498364"]/div[3]/button')
            show_more_units.click()
            time.sleep(0.2)
            print("Show more button clicked.")

        except:
            print('No button to "Show more".')
            break

我发现每个捆绑按钮都有不同的 ID。我也尝试过以下方法:

show_more_units = driver.find_element(By.XPATH, "//button[contains(text(), 'Einheiten anzeigen')]")

show_more_units = driver.find_element(By.CLASS_NAME, 'padding-left-none link-text-secondary button')

但这些选项都没有帮助。事实上,这两个选项甚至都不会扩展一个捆绑包。

我希望我的代码在抓取我需要的信息之前扩展所有包。我怎样才能实现这个目标?

先谢谢你。

附注按钮的 HTML 如下:

<button class="padding-left-none link-text-secondary button"><span class="s24-icons-s24_chevron_right_24"></span> <!-- -->3 weitere Einheiten anzeigen</button>
python selenium-webdriver
1个回答
0
投票

你们已经相当接近了。我改变了一些东西以使其正常工作:

  1. 不同的定位器。 CSS 选择器

    article button.button
    仅匹配所需的按钮。

  2. A

    WebDriverWait
    确保每次都可以单击 BUTTON。

  3. 我的

    try-except
    TimeoutException
    超时中专门捕获了
    WebDriverWait
    。只有在单击所有匹配的按钮并将其从页面中删除后,才会发生这种情况。

    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    
    url = 'https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-kaufen'
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get(url)
    wait = WebDriverWait(driver, 5)
    while True:
        try:
           wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"article button.button"))).click()
    
        except TimeoutException:
            break
    
    driver.quit()
    

补充说明:

  1. 最佳实践是仅捕获您计划处理的异常。捕获超过此数量可能会导致隐藏的故障,从而使调查变得更加困难。
  2. 在与任何元素交互之前,您应该始终使用
    WebDriverWait
    。它确保元素准备就绪并减少间歇性(有时是确定性)故障。
  3. 避免
    time.sleep()
    ,除非绝对必要。它将使您的脚本更快并且更不容易出错,请参阅上面的#2。
  4. 您的最终定位器尝试
    (By.CLASS_NAME, 'padding-left-none link-text-secondary button')
    错误地使用了
    By.CLASS_NAME
    。它只需要一个类名,而您发送了 3 个。要么只选择其中一个类,要么将其转换为
    By.CSS_SELECTOR
    ,例如
    .padding-left-none.link-text-secondary.button
© www.soinside.com 2019 - 2024. All rights reserved.