Selenium无法定位全部匹配元素,返回结果数量不稳定求助
解决方案
1. 更换稳定的元素定位器
你之前使用的XPath依赖固定DOM层级,页面结构稍有调整就会失效。建议换成基于卡片特征的定位方式,直接匹配公寓卡片内的详情链接:
# 示例:匹配cards容器下所有卡片内的详情链接(可根据实际页面class微调) links_list = driver.find_elements(By.XPATH, '//div[@id="cards"]//div[contains(@class, "card")]//a[contains(@href, "nadlan")]')
可以通过F12开发者工具验证定位器:在Console标签输入$x('你的XPath表达式'),查看返回的元素是否符合预期。
2. 处理滚动加载(核心问题)
该网站采用滚动加载更多公寓卡片的机制,静态等待30秒只能加载初始可见区域的内容,需模拟滚动直到所有内容加载完成:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time driver = webdriver.Chrome(executable_path="C:\\Users\\user\\Documents\\לימודים\\python\\selenium-project\\Driver\\chromedriver.exe") driver.get("https://www.ad.co.il/nadlansale?sp3=30&sp1=1,82,41,103,28,101,110") driver.maximize_window() # 循环滚动直到没有新内容加载 last_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待新内容加载 time.sleep(3) # 对比滚动高度,判断是否加载完成 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 等待所有链接元素可见后再提取 try: links_list = WebDriverWait(driver, 20).until( EC.visibility_of_all_elements_located((By.XPATH, '//div[@id="cards"]//div[contains(@class, "card")]//a')) ) # 提取所有href属性 apartment_hrefs = [link.get_attribute('href') for link in links_list] print(f"共获取到 {len(apartment_hrefs)} 个公寓链接") finally: driver.quit()
3. 规避反爬检测
部分网站会识别Selenium的自动化特征,导致内容加载异常,可添加Chrome启动参数规避:
from selenium.webdriver.chrome.options import Options options = Options() # 禁用自动化标识检测 options.add_argument("--disable-blink-features=AutomationControlled") # 设置正常浏览器UA options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") driver = webdriver.Chrome( executable_path="C:\\Users\\user\\Documents\\לימודים\\python\\selenium-project\\Driver\\chromedriver.exe", options=options )
内容的提问来源于stack exchange,提问作者Beli Florsaim
相关产品推荐
相关产品推荐

