使用Selenium爬取医生列表时名称重复的原因及解决方法
问题分析与解决方案
你遇到的重复输出同一个医生姓名的问题,核心原因是循环中每次都定位到了同一个元素,常见场景是误用了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 # 初始化Chrome浏览器(需确保ChromeDriver已配置到环境变量) driver = webdriver.Chrome() # 替换为你的搜索结果页面URL driver.get("https://www.doctoralia.com.mx/...") try: # 等待医生列表元素加载完成(最多等待10秒) # 注意:请根据页面实际结构调整CSS选择器,以下为示例 doctor_items = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".search-results .doctor-card__name")) ) # 遍历所有医生元素,提取姓名 doctor_names = [item.text.strip() for item in doctor_items if item.text.strip()] # 打印完整列表 for num, name in enumerate(doctor_names, 1): print(f"{num}. {name}") finally: # 关闭浏览器 driver.quit()
关键修正点说明
使用
find_elements()而非find_element():find_element()只会返回页面中第一个匹配的元素,循环21次就会重复输出第一个医生的姓名;而find_elements()会返回所有匹配的元素列表,遍历这个列表就能获取所有医生信息。等待元素加载完成:
网站是动态加载的,直接获取元素可能得到空列表,用WebDriverWait配合presence_of_all_elements_located确保所有医生元素加载完成后再提取。调整元素定位器:
请打开浏览器开发者工具(F12),检查医生姓名对应的HTML标签和class,替换代码中的CSS_SELECTOR值。比如实际页面中医生姓名可能在<h3 class="doctor-name">标签下,就把选择器改成.doctor-name。
注意事项
- 避免频繁请求网站,防止触发反爬机制导致访问受限;
- 如果页面有分页,需要额外处理分页逻辑;
- 若提取的姓名为空,可检查定位器是否准确,或元素是否被隐藏。
内容的提问来源于stack exchange,提问作者venkatesh L
相关产品推荐
相关产品推荐

