如何程序化提取knitr生成HTML中嵌入的DT datatable及CSV数据
可行的DT表数据提取方案
完全可以从knitr生成的HTML文件中提取DT::datatable的全量数据,你用rvest::html_table()抓不到的核心原因是:DT作为前端渲染的表格组件,不会把全量数据静态写入<table>标签,所有源数据都以JSON格式内嵌在页面的htmlwidget配置块中,和页面上的CSV按钮读取的是同一份源数据,不存在独立嵌入的.csv文件。
轻量提取方案(无重依赖,推荐)
只需要rvest+jsonlite+purrr三个包,直接解析内嵌的JSON配置块即可拿到全量数据,不受分页、前端渲染规则影响,速度远快于模拟浏览器的方案:
library(rvest) library(jsonlite) library(purrr) # 读入渲染完成的HTML文件 html_doc <- read_html("example.html") # 提取所有DT表数据 extracted_tables <- html_doc %>% # 定位htmlwidget存储配置的JSON脚本块 html_elements("script[type='application/json'][data-for]") %>% map(~{ conf <- fromJSON(html_text(.x), simplifyVector = TRUE) # 筛选出DT组件对应的块(存在x$data字段即为DT表) if (is.null(conf$x$data)) return(NULL) # 转换为标准data.frame,补全列名、行名 df <- as.data.frame(conf$x$data) colnames(df) <- c("row_names", conf$x$colnames) rownames(df) <- df$row_names df <- df[, -1] return(df) }) %>% discard(is.null) # 提取结果按Rmd中DT表的书写顺序存储在列表中 # 对应示例文件,第一个元素是tbl1,第二个是tbl2 tbl1 <- extracted_tables[[1]] tbl2 <- extracted_tables[[2]]
方案说明
- 该方法提取的是DT渲染用的原始源数据,和点击CSV按钮导出的内容完全一致,不需要额外模拟点击下载操作
- 不受DT配置影响:不管是否开启分页、是否显示CSV按钮、是否做了前端格式化,都能拿到完整的原始数据
- 如果确实需要抓取前端渲染后的DOM文本(比如DT列里加了自定义HTML标签、格式化后的显示值),才需要用无头浏览器方案(比如
chromote包)加载页面后再读取表格节点,常规取数场景完全不需要。
内容的提问来源于stack exchange,提问作者jsavn
相关产品推荐
相关产品推荐

