使用R(httr)批量获取PubMed文献摘要的问题求助
问题核心原因
你遇到的报错根本原因是构造请求URL时没有正确传入变量值,而是直接把变量名作为字符串写进了URL里,接口拿到的id参数是pmids或idc这几个字符串,不是你实际获取的PMID列表,因此判定ID为空。
PubMed的efetch接口完全支持一次性传入多个ID查询,单次请求最多支持200个ID,不需要循环逐个发送。
修正后的完整可运行脚本
library(httr) library(glue) library(xml2) library(dplyr) # 1. 构造检索请求获取PMID列表 reqq <- "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=science[journal]+AND+breast+cancer+AND+2008[pdat]&usehistory=y" op <- GET(reqq) pmids <- op %>% read_xml() %>% xml_find_all("//IdList/Id") %>% xml_text() # 2. 构造efetch请求获取文献元数据 # 直接拼接逗号分隔的ID串即可,不需要额外加引号再删除 id_str <- paste(pmids, collapse = ",") # 用glue把ID变量正确插入URL中 reqq1 <- glue("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id={id_str}&rettype=abstract&retmode=xml") op1 <- GET(reqq1) # 3. 解析XML生成目标数据框 xml_content <- read_xml(op1) pubs <- xml_find_all(xml_content, "//PubmedArticle") result_df <- lapply(pubs, function(pub) { # 提取文章标题 title <- xml_find_first(pub, ".//ArticleTitle") %>% xml_text() # 提取摘要,部分文献无公开摘要,做缺失值处理避免报错 abstract <- xml_find_first(pub, ".//AbstractText") %>% {ifelse(length(.) > 0, xml_text(.), NA_character_)} return(tibble(title = title, abstract = abstract)) }) %>% bind_rows()
补充说明
- 如果你的PMID数量超过200个,自行切割成每200个一组分批请求即可,不需要逐个循环
- 代码已经对无摘要的文献做了兼容处理,不会因为缺失值中断运行
内容的提问来源于stack exchange,提问作者Bahi8482
相关产品推荐
相关产品推荐

