使用R的httr包调用PubMed API获取摘要的相关问题求助
问题解决方法
你现有代码的核心问题是仅发送了请求未对返回结果做XML解析,且请求参数拼接、响应处理环节存在疏漏,以下是修正后的完整可运行流程:
library(XML) library(httr) library(glue) # 构造查询词,不需要手动拼接特殊符号,后续参数会自动处理编码 query <- 'asthma[mesh] AND leukotrienes[mesh] AND 2009[pdat]' # 用httr内置的query参数传参,避免手动拼接URL导致的编码错误,稳定性更高 response <- GET( url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi", query = list( db = "pubmed", term = query, retmax = 100 # 可自定义返回结果数量,接口默认返回20条 ) ) # 先校验请求状态,排除网络、参数错误导致的非预期返回 stop_for_status(response, "调用PubMed API") # 先提取响应中的纯XML文本再解析,避免直接传入响应对象导致的解析错误 xml_content <- content(response, as = "text", encoding = "UTF-8") parsed_xml <- xmlParse(xml_content) # 提取PMID列表 pmids <- xpathSApply(parsed_xml, "//IdList/Id", xmlValue) # 打印查看结果 print(pmids)
报错原因说明
你之前遇到的XML content does not seem to be XML以及标签不匹配报错,是因为直接将GET返回的响应对象传入解析函数,或者请求出错时NCBI返回了HTML格式的错误页,不是预期的XML格式,解析自然失败。上述代码先判断请求状态,再提取纯文本XML内容再解析,可完全解决该问题。
如果需要获取文献的详细信息,可以在拿到PMID后调用efetch接口实现,示例代码如下:
# 批量获取文献详情 fetch_response <- GET( url = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi", query = list( db = "pubmed", id = paste(pmids, collapse = ","), rettype = "abstract", # 可修改为medline、xml等返回格式 retmode = "text" ) ) stop_for_status(fetch_response, "获取文献详情") abstracts <- content(fetch_response, as = "text", encoding = "UTF-8")
内容的提问来源于stack exchange,提问作者Bahi8482
相关产品推荐
相关产品推荐

