我一直在抓取此页面: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>
你们已经相当接近了。我改变了一些东西以使其正常工作:
不同的定位器。 CSS 选择器
article button.button
仅匹配所需的按钮。
A
WebDriverWait
确保每次都可以单击 BUTTON。
我的
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()
补充说明:
WebDriverWait
。它确保元素准备就绪并减少间歇性(有时是确定性)故障。time.sleep()
,除非绝对必要。它将使您的脚本更快并且更不容易出错,请参阅上面的#2。(By.CLASS_NAME, 'padding-left-none link-text-secondary button')
错误地使用了 By.CLASS_NAME
。它只需要一个类名,而您发送了 3 个。要么只选择其中一个类,要么将其转换为 By.CSS_SELECTOR
,例如.padding-left-none.link-text-secondary.button
。