Python+BeautifulSoup提取clinicaltrials.gov XML数据缺失问题求解
问题解决:clinicaltrials.gov API XML解析缺失数据修复
问题根源
原代码的逻辑是全局搜索所有NCTId、BriefSummary、DetailedDescription字段后直接用zip()对齐,但部分临床试验没有DetailedDescription字段,导致三个字段的结果列表长度不一致。zip()函数默认按最短列表长度截断,因此最终仅能得到和DetailedDescription数量一致的5条结果,而非全部9条。
同时原代码直接将BeautifulSoup标签对象存入DataFrame,导出Excel时会保留标签结构而非纯文本,也需要同步修复。
修改后可运行代码
import requests from bs4 import BeautifulSoup import pandas as pd out = [] url = 'https://clinicaltrials.gov/api/query/full_studies?expr=diabetes+telehealth+peer+support&+AREA%5BStartDate%5D+EXPAND%5BTerm%5D+RANGE%5B01%2F01%2F2020%2C+09%2F01%2F2020%5D&min_rnk=1&max_rnk=50&fmt=xml' response = requests.get(url) soup = BeautifulSoup(response.content, 'lxml') # 先找到所有单条临床试验的根节点,保证每条记录对应1个试验 all_studies = soup.find_all("fullstudy") for study in all_studies: # 单个试验节点内单独查找所需字段,不存在则返回空值 nctid = study.find("field", {"name": "NCTId"}).get_text(strip=True) if study.find("field", {"name": "NCTId"}) else "" briefsummary = study.find("field", {"name": "BriefSummary"}).get_text(strip=True) if study.find("field", {"name": "BriefSummary"}) else "" detaileddescription = study.find("field", {"name": "DetailedDescription"}).get_text(strip=True) if study.find("field", {"name": "DetailedDescription"}) else "" data = { 'nctid': nctid, 'briefsummary': briefsummary, 'detaileddescription': detaileddescription } out.append(data) df = pd.DataFrame(out) df.to_excel('clinicaltrialstresults.xlsx', index=False)
逻辑说明
- 以单条临床试验为单位遍历,从根源避免字段数量不对齐的问题,无需单独创建子DataFrame再合并
- 对可选字段做存在性判断,无对应字段时自动填充空字符串,保证9条数据完整导出
- 增加
get_text(strip=True)提取纯文本,同时清理多余换行和空格,导出的Excel内容更规范 - 导出时增加
index=False去掉Excel中多余的索引列
内容的提问来源于stack exchange,提问作者tenebris silentio
相关产品推荐
相关产品推荐

