在R中用rvest爬取网页多表格仅获首表数据,如何获取全部?
解决R语言rvest爬取动态表格为空的问题
问题原因
目标页面的第2至第5个表格是JavaScript动态渲染的,read_html()只能抓取页面首次加载的静态HTML代码,此时这些表格的内容还未被JS填充,所以html_table()提取到的是空的tibble。
解决方案1:使用RSelenium模拟浏览器渲染
RSelenium可以模拟真实浏览器执行JavaScript,获取完整渲染后的页面内容,从而提取到所有表格数据。
步骤1:安装并加载依赖包
# 首次运行需安装包 install.packages(c("RSelenium", "rvest")) # 加载包 library(RSelenium) library(rvest)
步骤2:启动浏览器并访问目标页面
# 启动Chrome驱动(需确保本地已安装Chrome及对应版本的chromedriver) driver <- rsDriver(browser = "chrome", port = 4567L) remote_driver <- driver[["client"]] # 跳转至目标页面 remote_driver$navigate("https://report-nle.dephub.go.id/dashboard/detail/27019186") # 等待页面完全加载(可根据网络情况调整等待时长) Sys.sleep(5)
步骤3:提取完整页面的表格数据
# 获取渲染后的页面源码 page_html <- remote_driver$getPageSource()[[1]] %>% read_html() # 提取所有表格 tables <- page_html %>% html_nodes("table") %>% html_table() # 验证结果 lapply(tables, head)
步骤4:关闭浏览器驱动
remote_driver$close() driver[["server"]]$stop()
解决方案2:直接解析页面内嵌的动态数据
如果不想依赖浏览器模拟,可通过开发者工具定位表格数据的来源:
- 打开页面开发者工具(F12),切换到
Sources标签,查找页面内嵌的JSON格式数据; - 用
V8引擎解析这些数据,直接转换为数据框:
install.packages("V8") library(V8) # 获取静态页面源码,提取内嵌的JS数据 static_html <- read_html("https://report-nle.dephub.go.id/dashboard/detail/27019186") js_script <- static_html %>% html_nodes("script[type='text/javascript']") %>% html_text() # 筛选包含表格数据的脚本片段,用V8解析 ctx <- v8() ctx$eval(js_script) # 根据实际数据结构提取表格内容,示例需根据页面实际JS调整 table_data <- ctx$get("window.tableDataVariable")
内容的提问来源于stack exchange,提问作者Funkeh-Monkeh
相关产品推荐
相关产品推荐

