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
相关产品推荐
相关产品推荐

