PubMed作为全球权威的生物医学文献数据库,支持通过API返回XML格式的数据,使用Python解析这类数据可以高效提取所需的文献信息,避免手动整理的繁琐。本文会详细介绍从数据获取到解析提取的全流程。

准备工作
解析PubMed的XML数据需要用到两个核心工具,首先是requests库用于发送HTTP请求获取XML数据,其次是BeautifulSoup库用于解析XML结构。如果本地没有安装这两个库,可以先执行以下命令安装:
pip install requests beautifulsoup4
获取PubMed的XML数据
PubMed提供了E-utilities接口,我们可以通过构造请求URL获取指定文献的XML数据。比如要获取PMID为12345678的文献数据,请求的URL格式如下:
import requests
# 构造PubMed E-utilities请求URL
pmid = "12345678"
url = f"https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id={pmid}&retmode=xml"
# 发送请求获取数据
response = requests.get(url)
# 检查请求是否成功
if response.status_code == 200:
xml_data = response.text
print("XML数据获取成功")
else:
print(f"请求失败,状态码:{response.status_code}")
解析XML提取核心字段
获取到XML数据后,使用BeautifulSoup解析XML,提取文献的标题、作者、摘要、发表时间等常用字段。PubMed的XML结构中,文献标题存放在<ArticleTitle>标签,作者信息存放在<Author>标签下的<LastName>和<ForeName>,摘要存放在<AbstractText>标签。
from bs4 import BeautifulSoup
# 解析XML数据
soup = BeautifulSoup(xml_data, "xml")
# 提取文献标题
article_title = soup.find("ArticleTitle")
if article_title:
title = article_title.text
print(f"文献标题:{title}")
# 提取作者列表
authors = []
author_tags = soup.find_all("Author")
for author in author_tags:
last_name = author.find("LastName")
fore_name = author.find("ForeName")
if last_name and fore_name:
authors.append(f"{fore_name.text} {last_name.text}")
if authors:
print(f"作者列表:{', '.join(authors)}")
# 提取摘要
abstract_tag = soup.find("AbstractText")
if abstract_tag:
abstract = abstract_tag.text
print(f"摘要:{abstract}")
# 提取发表时间
pub_date = soup.find("PubDate")
if pub_date:
year = pub_date.find("Year")
month = pub_date.find("Month")
day = pub_date.find("Day")
date_parts = []
if year:
date_parts.append(year.text)
if month:
date_parts.append(month.text)
if day:
date_parts.append(day.text)
print(f"发表时间:{'-'.join(date_parts)}")
批量解析多文献XML数据
如果需要批量解析多个PMID对应的XML数据,可以构造多个PMID的请求,或者循环处理PMID列表。以下是批量解析的示例代码:
def parse_pubmed_xml(pmid_list):
results = []
base_url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id={}&retmode=xml"
for pmid in pmid_list:
url = base_url.format(pmid)
response = requests.get(url)
if response.status_code != 200:
print(f"PMID {pmid} 请求失败")
continue
soup = BeautifulSoup(response.text, "xml")
# 提取核心信息
title_tag = soup.find("ArticleTitle")
title = title_tag.text if title_tag else "无标题"
abstract_tag = soup.find("AbstractText")
abstract = abstract_tag.text if abstract_tag else "无摘要"
results.append({
"pmid": pmid,
"title": title,
"abstract": abstract
})
return results
# 测试批量解析
pmid_list = ["12345678", "23456789"]
data = parse_pubmed_xml(pmid_list)
for item in data:
print(f"PMID: {item['pmid']}, 标题: {item['title']}")
注意事项
- PubMed的E-utilities接口有请求频率限制,建议每次请求间隔1秒以上,避免被限制访问。
- 部分文献可能没有摘要或者作者信息不全,解析时需要做空值判断,避免程序报错。
- 如果需要获取大量文献数据,建议使用PubMed提供的批量接口,减少请求次数,提升效率。
PythonPubMedXML解析BeautifulSoup修改时间:2026-06-14 13:36:28