You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium循环爬取时无法找到元素,单独执行代码正常

问题分析与解决

核心问题原因

  • 你单独执行的代码仅针对单个元素获取链接,但放到循环里时,没先获取所有成员公司的容器集合,仍用find_element(单数)重复定位,导致要么重复拿第一个元素,要么后续未加载的元素找不到。
  • XPath只能拿到第一个容器,也是因为用了find_element(单数)而非find_elements(复数),或者表达式没匹配所有容器。
  • 循环过程中可能页面动态加载元素未完成,直接查找会抛出异常,缺少等待机制。

修正后的代码示例

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

browser = webdriver.Chrome()
browser.get("https://www.semi.org/en/resources/member-directory")

try:
    # 等待至少一个成员容器加载完成
    WebDriverWait(browser, 10).until(
        EC.presence_of_all_elements_located((By.CLASS_NAME, "member-company"))
    )
    
    # 获取所有成员容器(必须用find_elements复数形式)
    member_containers = browser.find_elements(By.CLASS_NAME, "member-company")
    
    for container in member_containers:
        # 基于当前容器定位内部标题元素,而非从整个页面查找
        title_element = container.find_element(By.CLASS_NAME, "member-company__title")
        link = title_element.find_element(By.TAG_NAME, "a").get_attribute("href")
        print(link)
        
        # 如果页面是滚动加载更多成员,可添加滚动逻辑
        # browser.execute_script("arguments[0].scrollIntoView();", container)
        
finally:
    browser.quit()

关键注意点

  • 必须用find_elements(复数)获取所有目标容器,才能遍历每个成员公司。
  • 定位子元素时要基于当前循环的容器,而非整个页面,避免定位混乱或重复。
  • 若页面是滚动加载更多内容,需额外添加滚动+等待新元素加载的逻辑,才能爬取完整的成员列表。

内容的提问来源于stack exchange,提问作者Crystal Waters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:55:19