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

使用rvest提取世界银行网站超链接失败,XPath无效求解

解决rvest抓取世界银行出版物链接失败的问题

问题分析

你的代码返回空值主要有两个原因:

  • XPath语法错误:// [@id="docdetail"]中//后多余了空格,且"是HTML转义字符,在R的XPath字符串中无需这样写,直接用双引号即可(注意用单引号包裹XPath表达式避免语法冲突)。
  • 绝对路径过于脆弱:依赖页面固定层级结构(如div[3]/div/div/div[1]...),一旦页面布局微调就会失效。

修正后的代码方案

方案1:修复原XPath语法

library(rvest)

download_link <- function(url) {
  page <- read_html(url) 
  # 修复XPath的空格和转义问题,用单引号包裹XPath,内部用双引号
  download_link <- page %>%
    html_nodes(xpath = '//*[@id="docdetail"]/div[3]/div/div/div[1]/div[2]/div[1]/div/div[2]/ul/li[2]/p/span/a') %>%
    html_attr("href") # 提取链接的href属性,而非返回节点对象
  return(download_link)
} 

url_sample <- 'https://documents.worldbank.org/en/publication/documents-reports/documentdetail/323431468249620613/haiti-emergency-recovery-and-disaster-management-project'
txt_link <- download_link(url_sample) 
txt_link

方案2:更健壮的选择器(推荐)

不依赖层级路径,而是根据链接的文本或属性定位,即使页面布局变化也能稳定抓取:

library(rvest)

download_link <- function(url) {
  page <- read_html(url) 
  # 抓取文本为"Text"的TXT下载链接
  txt_link <- page %>%
    html_nodes(xpath = '//span[contains(text(), "Text")]/a') %>%
    html_attr("href")
  
  # 同时抓取PDF下载链接
  pdf_link <- page %>%
    html_nodes(xpath = '//span[contains(text(), "PDF")]/a') %>%
    html_attr("href")
  
  return(list(txt = txt_link, pdf = pdf_link))
} 

url_sample <- 'https://documents.worldbank.org/en/publication/documents-reports/documentdetail/323431468249620613/haiti-emergency-recovery-and-disaster-management-project'
links <- download_link(url_sample) 
print(links$txt)
print(links$pdf)

关键说明

  • 必须调用html_attr("href")才能提取实际的链接地址,否则返回的是XML节点对象。
  • 方案2的选择器逻辑更稳定,只要下载区域的"Text"/"PDF"标识不变,就能成功抓取目标链接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:47:17