You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言爬取PubMed子页面摘要失败的技术求助

PubMed摘要抓取代码修复方案

核心问题诊断

你的代码存在几个致命错误:

  • get_pubmed函数里硬编码覆盖了传入的链接参数,导致始终访问搜索主页面,而非单篇文献的详情页
  • 尝试直接对字符串类型的链接向量调用html_nodes,这完全不符合rvest的使用逻辑——必须先读取每个链接对应的HTML页面
  • 搜索结果页的短摘要选择器错误,详情页的摘要抓取逻辑混乱

修复后的完整代码

library(rvest)  
library(dplyr)
library(purrr)

# 搜索链接
link <- "https://pubmed.ncbi.nlm.nih.gov/?term=((((((%E2%80%98Food%20Supply%E2%80%99%20(MeSH))%20OR%20%E2%80%98Food%20Storage%E2%80%99%20(MeSH))%20OR%20%E2%80%98Hunger%E2%80%99(MeSH)%20OR%20food%20security%20OR%20food%20insecurity%20OR%20household%20food%20security%20OR%20global%20food%20security)%20OR%20household%20food%20insecurity)))%20AND%20((%E2%80%98Prevalence%E2%80%99%20(MeSH))%20OR%20%E2%80%98Cross-Sectional%20Studies%E2%80%99%20(MeSH)%20OR%20cross-sectional%20study%20OR%20Prevalence%20Studies%20OR%20prevalence%20study%20OR%20Cross-Sectional%20Analyses%20OR%20CrossSectional%20Analysis%20OR%20Cross%20Sectional%20Analysis%20OR%20Cross%20Sectional%20Analyses)&filter=lang.english&filter=lang.portuguese"

# 读取搜索结果页面
page <- read_html(link)

# 提取搜索结果的基础信息
pubmed <- tibble(
  title = page %>% html_nodes(".docsum-title") %>% html_text2(),
  authors = page %>% html_nodes(".full-authors") %>% html_text2(),
  pmid = page %>% html_nodes(".docsum-pmid") %>% html_text2(),
  snippet = page %>% html_nodes(".docsum-snippet") %>% html_text2(),
  detail_link = page %>% html_nodes(".docsum-title") %>% html_attr("href") %>% 
    paste0("https://pubmed.ncbi.nlm.nih.gov", .)
)

# 定义抓取单篇文献摘要的函数
get_abstract <- function(detail_url) {
  # 读取详情页HTML
  detail_page <- read_html(detail_url)
  # 提取英文摘要(合并段落,处理无摘要的情况)
  abstract <- detail_page %>% 
    html_nodes("#eng-abstract .abstract-content p") %>% 
    html_text2() %>% 
    paste(collapse = " ")
  
  # 无摘要时返回NA
  if(length(abstract) == 0) abstract <- NA_character_
  return(abstract)
}

# 批量抓取所有摘要(加入延迟避免被网站封禁)
pubmed$abstract <- map_chr(pubmed$detail_link, ~{
  Sys.sleep(1) # 每次请求间隔1秒,可根据情况调整
  get_abstract(.x)
})

# 查看结果
print(pubmed)

关键修改说明

  1. 函数逻辑修正:get_abstract函数接收传入的详情页链接,单独读取每个页面的HTML后再提取摘要,不再硬编码主页面链接
  2. 选择器修正:搜索结果页的短摘要改用.docsum-snippet(PubMed搜索结果预览的正确类名),详情页摘要使用#eng-abstract .abstract-content p精准定位英文摘要内容
  3. 防封禁处理:加入Sys.sleep(1)控制请求频率,避免触发PubMed的反爬机制
  4. 容错处理:对无摘要的文献返回NA,避免代码中断
  5. 数据结构优化:使用tibble替代data.frame,更适配tidyverse生态,同时用html_text2()替代html_text(),自动处理换行和空格

内容的提问来源于stack exchange,提问作者Ileeo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:40:37