Python Selenium如何仅获取筛选后显示的元素而非全部DOM元素?
问题解决思路
你拿到30个全量条目而非手动筛选后4个展示结果的核心原因有两个:
- 这个测试站点的前端筛选逻辑,是通过给非匹配商品加
display: none的CSS样式来隐藏内容,并不会把不匹配的条目从DOM结构里移除。Selenium原生的find_elements_by_css_selector会抓取DOM中所有匹配选择器的节点,不管元素是不是真的在页面上展示——哪怕元素已经被样式完全隐藏,只要DOM里还存在,就会被算进返回结果。 - 缺少异步等待逻辑:向搜索框输入关键词后,前端JS需要一小段响应时间来执行筛选、给非匹配条目加隐藏样式,你的代码在DOM还没完成样式更新时就立刻执行元素查找,自然会把全量条目都抓出来。
具体调整方案
你需要从两个方向修改代码,才能拿到筛选后真正展示的条目:
- 补充显式等待逻辑,确认前端的筛选逻辑已经执行完成,避免因为JS异步延迟导致查找时机错位
- 调整过滤规则,只统计页面上实际可见的商品节点,自动排除被CSS隐藏的非匹配条目
- 替换已经废弃的旧版Selenium定位API(
find_elements_by_css_selector是Selenium2时代的旧写法,现在统一推荐使用By类的定位方式)
修改后的参考代码
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 driver = webdriver.Chrome() driver.get("https://rahulshettyacademy.com/seleniumPractise/#/") # 等待搜索框加载完成后输入筛选关键词 search_box = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='search']")) ) search_box.send_keys("ca") # 显式等待筛选生效:等明确不在"ca"匹配范围的商品(比如西兰花)被隐藏 WebDriverWait(driver, 10).until( EC.invisibility_of_element_located((By.XPATH, "//h4[text()='Broccoli']")) ) # 拿到所有匹配选择器的h4节点,逐一遍历过滤出实际可见的条目 all_veg_nodes = driver.find_elements(By.CSS_SELECTOR, "div.products-wrapper div h4") visible_filtered_items = [node for node in all_veg_nodes if node.is_displayed()] print(len(visible_filtered_items)) # 运行后会输出4,和手动筛选的结果一致
注意事项
- 不要用隐式等待代替这里的显式等待:隐式等待只会等待元素出现在DOM结构中,既不会等前端JS执行完样式更新,也没法帮你过滤掉隐藏的DOM节点
- 不要依赖
:visible这类jQuery专属的CSS伪类选择器,Selenium原生的CSS解析器不支持这类写法,会抛出定位异常
内容的提问来源于stack exchange,提问作者nataraj
相关产品推荐
相关产品推荐

