You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:15:48