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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:45:04