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

Python使用BeautifulSoup解析Clinicaltrials.gov XML提取NCTId与官方标题

问题原因
  • 调用find_all()时参数逻辑错误:Field是XML节点的标签名,Name是节点的属性,不能将两者拼接作为标签名搜索
  • 解析器选择错误:使用lxml作为BeautifulSoup解析器时默认工作在HTML解析模式,处理XML结构容易出现兼容问题,需要指定XML专用解析器
  • 不需要写HTML转义符:查询参数中的引号不需要写"转义格式,直接使用原始字符串即可
修复后可运行的完整代码
import requests
from bs4 import BeautifulSoup

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=10&fmt=xml'
response = requests.get(url)
# 指定xml专用解析器,保证XML结构被正确识别
soup = BeautifulSoup(response.content, 'xml')

study_list = []
# 先提取每条临床试验的根节点,避免跨记录匹配导致字段对应关系错乱
for study_node in soup.find_all('FullStudy'):
    # 查找当前记录下NCTId对应的Field节点
    nct_id = study_node.find('Field', {'Name': 'NCTId'}).get_text(strip=True)
    # 查找当前记录下OfficialTitle对应的Field节点
    official_title = study_node.find('Field', {'Name': 'OfficialTitle'}).get_text(strip=True)
    study_list.append({
        'nct_id': nct_id,
        'official_title': official_title
    })

# 测试输出结果
for item in study_list:
    print(f"NCT号:{item['nct_id']}")
    print(f"官方标题:{item['official_title']}\n---")
核心逻辑说明
  • 优先指定xml作为解析器,完全适配XML格式的返回结果,避免HTML解析模式的兼容问题
  • 先提取所有<FullStudy>节点(每个节点对应一条独立的临床试验记录),再对每个节点单独查询目标字段,完全避免不同记录的字段匹配错位问题
  • 使用find()查询单个字段,配合get_text(strip=True)提取纯文本内容,自动去除前后多余的空白符
  • 可选优化:如果存在部分试验缺失对应字段的情况,可在提取字段前增加非空判断,避免调用get_text()时报错

内容的提问来源于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 14:15:00