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

R语言for循环rbind合并数据帧列数不匹配报错解决

报错核心原因

rbind列数不匹配的根源是不同比赛记分卡页提取到的注释条数不固定:

  • 你的get_notes函数通过CSS选择器匹配页面注释,部分比赛可能有1条、2条甚至更多注释,部分无注释的页面会返回长度为0的空向量
  • 代码里用t(notes)把sapply返回的结果转置为宽格式时,每一行的列数完全对应当前比赛抓到的注释条数,列数动态变化的情况下直接调用rbind必然触发列数不匹配错误
  • 原代码没有做异常捕获、空值处理,单个页面访问失败、元素不存在就会直接中断整个循环,稳定性很差
修正后可运行代码
library(dplyr)
library(rvest)

# 增加容错的注释提取函数,避免单个页面报错中断整个循环
get_notes = function(score_url){
  tryCatch({
    score_page = read_html(score_url)
    score_notes = score_page %>% 
      html_nodes(".ds-mt-3 .ds-mb-4 .ds-p-4,
                 .ds-mb-4~ .ds-mb-4+ .ds-mb-4 .ds-p-4,
                 .ds-mt-3 .ds-text-typo-title .ds-text-tight-s") %>% 
      html_text(trim = TRUE) # 自动清除首尾多余空白、换行
    # 无注释时返回NA,避免空向量导致后续绑定出错
    if(length(score_notes) == 0) score_notes = NA_character_
    return(score_notes)
  }, error = function(e){
    message(paste("抓取失败:", score_url, "错误信息:", e$message))
    return(NA_character_)
  })
}

# 用列表暂存每年结果,避免循环中频繁rbind的低效率问题
notes_list = list()

for (page_result in c(2019,2020,2021)){
  link = paste0("https://stats.espncricinfo.com/ci/engine/records/team/match_results.html?class=2;id=",
                page_result,";type=year")
  pages = read_html(link)
  
  # 提取记分卡文本和对应URL
  match_schedule = pages %>% html_nodes("td:nth-child(7) .data-link")
  scorecard = match_schedule %>% html_text(trim = TRUE)
  match_url = match_schedule %>% 
    html_attr("href") %>%
    paste0("https://www.espncricinfo.com", .) 
  
  # 逐场提取注释
  notes = sapply(match_url, FUN = get_notes, USE.NAMES = FALSE)
  
  # 构成长格式数据集:每条注释单独占一行,从根源避免列数不匹配问题
  year_df = data.frame(
    year = page_result,
    scorecard_name = rep(scorecard, times = sapply(notes, length)),
    match_url = rep(match_url, times = sapply(notes, length)),
    note_content = unlist(notes),
    desperse.level = 0
  )
  
  notes_list[[as.character(page_result)]] = year_df
  Sys.sleep(1) # 增加1秒请求间隔,避免被反爬拦截
  print(paste("完成抓取年份:", page_result))
}

# 一次性合并所有年份数据
notesdata = bind_rows(notes_list)

# 导出为UTF-8编码的CSV文件,可直接用Excel打开
write.csv(notesdata, "cricinfo_match_notes.csv", row.names = FALSE, fileEncoding = "UTF-8")
关键调整点
  • 放弃宽格式转置逻辑,改用长格式存储:每条注释单独占一行,同步关联比赛年份、记分卡名称、对应比赛URL字段,从根源上消除列数不匹配问题,长格式也更适合后续数据筛选、分析
  • 给抓取函数增加异常捕获逻辑,单个页面抓取失败不会中断整个循环,失败条目会标记为NA并打印错误日志方便排查
  • 提取文本时自动清除首尾多余的换行、空格,减少后续数据清洗工作量
  • 增加请求间隔,避免短时间请求频率过高被网站反爬机制拦截
  • 改用列表暂存抓取结果,循环结束后一次性合并,比循环中反复调用rbind效率更高,也不会出现字段类型不匹配问题
  • 对无注释的页面自动填充NA,避免空向量导致的行绑定错误

内容的提问来源于stack exchange,提问作者Futa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:48:34