使用R从HTML节点下载动态文件的路径获取问题
解决R语言rvest/xml2获取政府公报下载链接异常的问题
这种href以0结尾的情况,大多是因为页面的下载链接是JavaScript动态生成的——Chrome审查元素看到的是JS执行后的最终链接,但rvest和xml2默认只抓取原始静态HTML,所以拿到的是未被JS处理的初始占位值(比如0)。下面是几种可行的解决方法:
方法1:从页面元素提取ID拼接链接
很多政府网站的下载链接核心是唯一文档ID(比如你例子里的7620),这个ID通常会藏在页面的其他属性里,比如按钮的data-*属性、列表项的ID标签里:
library(rvest) # 替换成目标页面的URL target_url <- "https://ioes.dio.es.gov.br/portal/edicoes" page <- read_html(target_url) # 假设ID在带data-id属性的下载按钮中,根据实际页面调整选择器 doc_id <- page %>% html_element("[data-id]") %>% # 替换成实际的元素选择器 html_attr("data-id") # 拼接正确的下载链接 download_link <- paste0("https://ioes.dio.es.gov.br/portal/edicoes/download/", doc_id)
方法2:用RSelenium模拟浏览器加载动态内容
如果ID无法从静态HTML中提取,就需要模拟浏览器让JS执行完成后再抓取:
library(RSelenium) library(rvest) # 启动Chrome会话(需提前安装ChromeDriver并配置环境变量) driver <- rsDriver(browser = "chrome", port = 4567L) remDr <- driver[["client"]] # 访问目标页面 remDr$navigate(target_url) # 获取JS执行后的完整页面源码 page_source <- remDr$getPageSource()[[1]] page <- read_html(page_source) # 直接抓取正确的下载链接(替换成实际的链接选择器) download_link <- page %>% html_element("a[href*='download']") %>% html_attr("href") # 关闭浏览器会话 remDr$close() driver$server$stop()
方法3:直接调用下载接口
打开Chrome开发者工具的「网络」面板,点击下载按钮,找到触发的真实请求URL,直接用httr或download.file下载:
library(httr) # 替换成实际的下载ID download_url <- "https://ioes.dio.es.gov.br/portal/edicoes/download/7620" # 发送请求并保存文件 response <- GET(download_url) writeBin(content(response, "raw"), paste0("政府公报_", Sys.Date(), ".pdf"))
内容的提问来源于stack exchange,提问作者iago nunes
相关产品推荐
相关产品推荐

