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
相关产品推荐
相关产品推荐

