使用Selenium爬取classic.clinicaltrials.gov表格数据失败,请求技术帮助
解决ClinicalTrials.gov临床试验数据爬取问题
原代码的核心问题
- XPath语法错误:定位表格tbody时缺失
table标签,正确路径应为//table[@id="theDataTable"]/tbody - 行元素定位逻辑错误:使用绝对路径会重复获取所有行,应改用相对路径
.//tr基于tbody查找 - 循环嵌套混乱:多余的
[role="row"]查找,且直接对列表调用find_elements方法,导致无法正确读取单元格内容 - 未处理页面加载延迟:页面元素未完全渲染就执行查找,大概率导致元素定位失败
修正后的完整代码(含Excel保存功能)
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 import pandas as pd # 初始化Chrome浏览器 driver = webdriver.Chrome() target_url = "https://classic.clinicaltrials.gov/ct2/results?cond=&term=&cntry=&state=&city=&dist=" driver.get(target_url) # 等待表格加载完成(最长等待10秒) wait = WebDriverWait(driver, 10) table_body = wait.until(EC.presence_of_element_located((By.XPATH, '//table[@id="theDataTable"]/tbody'))) # 获取表格内所有数据行(相对路径避免重复获取) rows = table_body.find_elements(By.XPATH, './/tr') # 存储爬取数据的列表 clinical_data = [] for row in rows: # 跳过表头行 if row.get_attribute('class') == 'headerRow': continue # 提取研究标题 title_elem = row.find_element(By.XPATH, './/td[2]/a') study_title = title_elem.text # 提取病症(多病症用分号分隔) condition_cell = row.find_element(By.XPATH, './/td[3]') condition_list = condition_cell.find_elements(By.TAG_NAME, 'li') conditions = '; '.join([item.text for item in condition_list]) # 提取干预措施(多措施用分号分隔) intervention_cell = row.find_element(By.XPATH, './/td[4]') intervention_list = intervention_cell.find_elements(By.TAG_NAME, 'li') interventions = '; '.join([item.text for item in intervention_list]) # 将单条数据存入列表 clinical_data.append({ '研究标题': study_title, '病症': conditions, '干预措施': interventions }) # 关闭浏览器 driver.quit() # 将数据保存到Excel文件 df = pd.DataFrame(clinical_data) df.to_excel('临床试验数据汇总.xlsx', index=False, encoding='utf-8-sig') print("数据已成功保存至'临床试验数据汇总.xlsx'")
关键优化点说明
- 加入
WebDriverWait等待机制,确保表格元素完全渲染后再进行查找 - 修正XPath定位逻辑,精准定位目标单元格
- 处理多值字段(病症、干预措施),用分号拼接成字符串方便Excel存储
- 集成
pandas库实现数据到Excel的批量保存
内容的提问来源于stack exchange,提问作者Adhithyah G
相关产品推荐
相关产品推荐

