使用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
相关产品推荐
相关产品推荐

