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

