如何使用Python Selenium搜索关键词并选择下拉框抓取诊所信息?
自定义下拉菜单交互与诊所信息提取实现
前置修正
现有代码使用的find_element_by_*系列方法在新版Selenium中已被废弃,同时缺少动态等待逻辑,headless模式下容易出现元素未加载完成导致的操作失败问题,实现时需要替换为新版定位语法,添加显式等待。
下拉选择核心逻辑
目标网站的Allgemeinmedizin分类选择不是原生HTML <select>组件,而是自定义的前端交互下拉,无法直接通过Selenium内置的Select类完成选择,需要按实际交互流程编写操作步骤:
- 等待下拉触发元素可被点击
- 点击触发元素展开完整选项列表
- 定位选项文本匹配
Hausärzte的元素并点击完成选择 - 等待搜索结果加载完成后批量提取目标字段
完整可运行代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC chrome_options = Options() chrome_options.add_argument("--headless") # 规避headless模式下的元素定位异常 chrome_options.add_argument("window-size=1920,1080") PATH = "C:\Program Files (x86)\chromedriver.exe" driver = webdriver.Chrome(executable_path=PATH, options=chrome_options) # 设置全局等待超时时间为15秒 wait = WebDriverWait(driver, 15) try: driver.get("https://www.kvwl.de/earzt/index.htm") print("页面标题:", driver.title) # 1. 输入搜索地点 search_input = wait.until( EC.element_to_be_clickable((By.ID, "doc-search-search-location")) ) search_input.send_keys("Frankfurt, Germany") search_input.send_keys(Keys.ENTER) # 2. 处理Allgemeinmedizin下拉菜单 # 定位下拉触发元素并点击展开 dropdown_trigger = wait.until( EC.element_to_be_clickable((By.ID, "doc-search-specialization")) ) dropdown_trigger.click() # 定位Hausärzte选项并点击 hausarzt_option = wait.until( EC.element_to_be_clickable((By.XPATH, "//li[contains(text(), 'Hausärzte')]")) ) hausarzt_option.click() # 触发搜索(选择分类后需要确认搜索操作) search_submit = wait.until( EC.element_to_be_clickable((By.ID, "doc-search-submit")) ) search_submit.click() # 3. 等待搜索结果加载,提取诊所信息 result_items = wait.until( EC.presence_of_all_elements_located((By.CLASS_NAME, "result-item")) ) clinic_info = [] for item in result_items: name = item.find_element(By.CLASS_NAME, "doc-name").text.strip() address = item.find_element(By.CLASS_NAME, "doc-address").text.strip() # 部分条目可能无联系电话,做异常兼容 try: phone = item.find_element(By.CLASS_NAME, "doc-phone").text.strip() except: phone = "未公示" clinic_info.append({ "诊所名称": name, "地址": address, "联系电话": phone }) # 打印提取结果 for idx, info in enumerate(clinic_info, 1): print(f"\n第{idx}条诊所信息:") print(f"名称:{info['诊所名称']}") print(f"地址:{info['地址']}") print(f"电话:{info['联系电话']}") finally: driver.quit()
常见问题排查
- 若下拉元素定位失败:可检查展开后的选项实际父容器,将XPATH表达式调整为
//div[@id="doc-search-specialization-list"]//li[text()='Hausärzte']缩小定位范围 - 若headless模式下无法点击下拉:检查是否未设置窗口大小,无固定窗口尺寸时headless模式下部分组件会因视口过小被隐藏
- 若结果提取为空:等待条件替换为
EC.visibility_of_element_located,确保元素已经渲染到可视区域而非仅存在于DOM树中
注意:爬取前请确认网站的robots协议与使用条款,控制请求频率避免对服务器造成压力。
内容的提问来源于stack exchange,提问作者ChKYu
相关产品推荐
相关产品推荐

