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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 09:36:04