R提取PubMed摘要行数多于PMID无法合并问题求解
问题根因
你之前的代码直接全局匹配所有AbstractText节点,只要某篇文献包含多个结构化摘要节点(比如背景、方法、结论分节点的情况),就会被拆分为多行,自然会出现摘要行数高于PMID、标题行数的问题。
解决方案
核心逻辑是按单篇文献为单位提取字段:先定位到每篇文献的独立节点,再对单篇节点内的所有AbstractText内容做拼接,保证每篇文献仅返回1条合并后的摘要,三个字段天然对齐。
修改后的完整可运行代码
library(XML) library(httr) library(glue) library(dplyr) query = 'asthma[mesh]+AND+eosinophils[mesh]+AND+2009[pdat]' reqq = glue ('https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&RetMax=50&term={query}') op = GET(reqq) df_op <- op %>% xml2::read_xml() %>% xml2::as_list() pmids <- df_op$eSearchResult$IdList %>% unlist(use.names = FALSE) reqq1 = glue("https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id={paste0(pmids, collapse = ',')}&rettype=abstract&retmode=xml") op1 = GET(reqq1) a = xmlParse(content(op1)) # --------------------修改部分开始-------------------- # 获取所有单篇文献的根节点 article_nodes <- getNodeSet(a, '/PubmedArticleSet/PubmedArticle/MedlineCitation') # 逐篇提取三个字段并拼接摘要 result_list <- lapply(article_nodes, function(single_node){ # 提取当前篇PMID pmid_val <- xpathSApply(single_node, './PMID', xmlValue) # 提取当前篇标题 title_val <- xpathSApply(single_node, './Article/ArticleTitle', xmlValue) # 提取当前篇所有摘要片段,拼接为单个字符串,无摘要返回NA abstract_segs <- xpathSApply(single_node, './Article/Abstract/AbstractText', xmlValue) abstract_val <- ifelse(length(abstract_segs) > 0, paste(abstract_segs, collapse = " "), NA_character_) return(data.frame( pmid = pmid_val, title = title_val, abstract = abstract_val, stringsAsFactors = FALSE )) }) # 合并为最终数据框 final_pubmed_df <- do.call(rbind, result_list) # --------------------修改部分结束-------------------- # 校验行数 nrow(final_pubmed_df) length(pmids)
方案说明
- 所有字段从同一篇文献的根节点下提取,不会出现字段错配的问题
- 用
paste(..., collapse = " ")将同一篇文献的多个摘要片段合并为一行,不管有多少个AbstractText节点都只会返回1条结果 - 兼容无摘要的文献,不会因节点缺失导致提取报错
内容的提问来源于stack exchange,提问作者Bahi8482
相关产品推荐
相关产品推荐

