使用R语言easyPubMed包批量下载PubMed记录异常求助
问题根因
R 4.1.3环境下easyPubMed出现两类异常的核心原因有两点:
- 2022年后NCBI对PubMed E-utilities接口的返回格式、编码规则做了调整,CRAN上适配R4.1.x的旧版easyPubMed未做对应适配,导致文件写入、内容读取时出现换行识别错误、NA填充问题。
- 最新版
XML依赖包要求R版本≥4.2.0,在R4.1.3环境下安装会出现底层解析逻辑不兼容,无法正常将接口返回的文本转为XML对象。
分步解决方法
1. 修复版本兼容问题
先执行以下操作清理不兼容的包版本:
remove.packages(c("easyPubMed", "XML"))
安装适配R4.1.3的版本:
- 从CRAN归档库下载
XML_3.99-0.11版本源码包,本地执行安装,不要安装最新版XML包。 - 从CRAN归档库下载
easyPubMed_2.13版本源码包,本地执行安装,不要直接安装CRAN当前推送的最新版easyPubMed,该2.13版本已适配NCBI更新后的接口规则。
2. 修正原有代码的参数配置
修复batch_pubmed_download()返回NA问题
原有代码缺少显式格式指定参数,且读取文件时未做编码防护,修正后代码如下:
library(easyPubMed) new_query <- "(APE1[TI] OR OGG1[TI]) AND (2012[PDAT]:2016[PDAT])" out.A <- batch_pubmed_download( pubmed_query_string = new_query, dest_file_prefix = "easyPM_example", batch_size = 150, encoding = "UTF-8", format = "xml", api_key = NULL ) # 读取时关闭warn提示,显式指定编码 cat(readLines(out.A[1], encoding = "UTF-8", warn = FALSE)[1:32], sep = "\n")
修复fetch_pubmed_data()返回类型不符问题
原有代码未指定返回格式,且缺少手动解析步骤,修正后代码如下:
my_query <- '"genetic therapy"[MeSH Terms]' my_entrez_id <- get_pubmed_ids(my_query) # 显式指定返回格式为xml my_abstracts_text <- fetch_pubmed_data(my_entrez_id, retmode = "xml") # 手动调用XML包解析为目标对象 my_abstracts_xml <- XML::xmlParse(my_abstracts_text) # 校验返回类型 class(my_abstracts_xml)
3. 兜底替代方案
如果上述操作后仍存在异常,可以绕过easyPubMed的封装,直接用rentrez包实现批量下载,逻辑更稳定:
# 安装依赖 install.packages(c("rentrez", "XML")) library(rentrez) new_query <- "(APE1[TI] OR OGG1[TI]) AND (2012[PDAT]:2016[PDAT])" # 获取所有匹配的PMID all_pmids <- entrez_search(db = "pubmed", term = new_query, retmax = 10000)$id # 按150条每批拆分 batch_list <- split(all_pmids, ceiling(seq_along(all_pmids)/150)) # 分批拉取并写入本地文件 for(i in seq_along(batch_list)){ rec_content <- entrez_fetch(db = "pubmed", id = batch_list[[i]], rettype = "xml") writeLines(rec_content, con = paste0("easyPM_example_batch", i, ".xml"), useBytes = TRUE) }
内容的提问来源于stack exchange,提问作者iron captain
相关产品推荐
相关产品推荐

