使用rvest爬取枪支法律网站数据时遇下标越界错误的解决求助
解决R爬虫报错:Error in df1[[1]] : subscript out of bounds
报错原因
你用Selector Gadget获取的.js-view-dom-id-xxx是动态生成的class,这类class由前端框架随机生成,每次访问页面都会变化,导致html_nodes()找不到对应元素,返回空的df1,因此调用df1[[1]]时会触发“下标越界”错误。此外,直接提取文本也不是爬取表格数据的正确方式。
解决方案
替换动态选择器为页面中固定的节点标识,同时改用html_table()解析表格结构,添加错误处理避免程序中断:
library(rvest) library(tidyverse) years <- lapply(c(2006:2018), function(x) { link <- paste0('https://www.statefirearmlaws.org/national-data/', x) # 捕获页面加载和解析错误 tryCatch({ page <- read_html(link) # 用固定选择器定位表格(页面中表格位于div.view-content下) table_node <- page %>% html_nodes('div.view-content table') if(length(table_node) == 0) { warning(paste("未找到", x, "年的表格数据")) return(NULL) } # 解析表格为结构化数据框,添加年份列 df <- table_node %>% html_table(header = TRUE, trim = TRUE) %>% pluck(1) %>% mutate(year = x) return(df) }, error = function(e) { warning(paste("处理", x, "年数据失败:", e$message)) return(NULL) }) }) # 合并所有年份的有效数据 combined_gun_laws <- bind_rows(years)
关键说明
- 固定选择器:
div.view-content table是页面内容区域的固定结构,不会随页面加载变化,能稳定定位目标表格。 - 表格解析:
html_table()直接将HTML表格转换为数据框,无需手动处理文本,更适合结构化数据爬取。 - 错误处理:
tryCatch和长度检查能避免单个年份数据异常导致整个程序崩溃,同时输出警告提示问题所在。
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

