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

基于Python+Selenium实现ICD-10网站动态内容爬取需求

实现ICD-10页面嵌套箭头展开与内容加载的Selenium方案

核心思路

要完成这个需求,关键是处理动态加载的嵌套元素:先循环点击所有可展开的箭头(展开后可能会出现新的箭头),再依次点击内容单元格加载详情。下面是可直接运行的Python Selenium代码,附带关键步骤说明。

完整实现代码

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
from selenium.common.exceptions import StaleElementReferenceException, ElementNotInteractableException

# 初始化Chrome浏览器(需提前配置好ChromeDriver)
driver = webdriver.Chrome()
driver.get("https://icd.who.int/browse10/2019/en")
driver.maximize_window()

# 配置显式等待,最长等待10秒
wait = WebDriverWait(driver, 10)

def expand_all_arrows():
    """循环展开所有可点击的嵌套箭头,直到无新箭头出现"""
    while True:
        # 定位当前页面所有目标箭头
        arrows = wait.until(EC.presence_of_all_elements_located(
            (By.XPATH, "//tr[@class='ygtvrow']//td[starts-with(@id, 'ygtvt') and (contains(@class, 'ygtvcell ygtvtm') or contains(@class, 'ygtvcell ygtvtp') or contains(@class, 'ygtvcell ygtvlm'))]")
        ))
        initial_count = len(arrows)
        clicked_count = 0
        
        for arrow in arrows:
            try:
                # 只点击未展开的箭头(通过class区分状态)
                if "ygtvtm" in arrow.get_attribute("class") or "ygtvlm" in arrow.get_attribute("class"):
                    arrow.click()
                    clicked_count += 1
                    # 等待新元素加载完成
                    wait.until(EC.staleness_of(arrow))
            except (StaleElementReferenceException, ElementNotInteractableException):
                # 元素过期或不可点击时直接跳过
                continue
        
        # 本轮无点击则说明所有箭头已展开,退出循环
        if clicked_count == 0:
            break

def click_content_elements():
    """依次点击所有内容单元格,加载对应页面内容"""
    # 定位所有目标内容元素
    content_elements = wait.until(EC.presence_of_all_elements_located(
        (By.XPATH, "//tr[@class='ygtvrow']//td[@class='ygtvcell ygtvhtml ygtvcontent']")
    ))
    
    for idx, element in enumerate(content_elements):
        try:
            # 滚动到元素可见位置,避免视窗外点击失败
            driver.execute_script("arguments[0].scrollIntoView(true);", element)
            element.click()
            # 等待内容加载完成(可根据页面实际加载速度调整)
            wait.until(EC.presence_of_element_located((By.CLASS_NAME, "icd10-browser-content")))
            print(f"已点击第 {idx+1} 个内容元素")
        except (StaleElementReferenceException, ElementNotInteractableException):
            print(f"跳过第 {idx+1} 个不可交互的内容元素")
            continue

# 执行完整流程
try:
    expand_all_arrows()
    click_content_elements()
finally:
    # 操作完成后关闭浏览器
    driver.quit()

关键细节说明

  • 显式等待替代硬等待:用WebDriverWait确保元素加载完成后再操作,避免动态渲染导致的元素丢失问题。
  • 循环展开逻辑:展开父级箭头会触发子级箭头加载,因此用循环持续检测,直到没有新箭头可点击。
  • 异常捕获:处理元素过期、不可交互等常见异常,保证程序稳定运行。
  • 滚动定位:点击前滚动到元素位置,解决视窗外元素无法点击的问题。

内容的提问来源于stack exchange,提问作者Mohammad Aladwani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:58:29