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

