R语言网页爬取报错:arguments imply differing number of rows 求解
解决维基百科表格爬取问题
问题分析
- rvest爬取行数少:大概率是维基表格存在合并单元格,默认
html_table()只读取非合并行,或是你选的表格索引有误。 - httr+XML转data.frame报错:合并单元格导致各列的节点数量不一致,直接转换时列长度不匹配。
正确解决方法(优先用rvest)
用rvest的html_table()时加上fill=TRUE参数,强制填充合并单元格的空值,同时用wikitable类精准筛选目标表格:
library(rvest) # 替换成你要爬的维基页面URL url <- "https://zh.wikipedia.org/wiki/你的目标页面" page <- read_html(url) # 提取第二个标准维基表格,fill=TRUE处理合并单元格 wiki_table <- page %>% html_nodes("table.wikitable") %>% .[[2]] %>% html_table(fill = TRUE, header = TRUE) # 查看结果 dim(wiki_table) head(wiki_table)
核心原因
维基百科的内容表格基本都带有wikitable类,用这个筛选比直接选table更精准,避免误选页面导航表格或其他小表格。fill=TRUE会自动给合并单元格对应的行填充NA,保证每行列数一致,不会丢失行数据。
处理httr+XML的报错
如果一定要用XML包,需要先统一列长度,手动填充NA:
library(httr) library(XML) url <- "https://zh.wikipedia.org/wiki/你的目标页面" response <- GET(url) doc <- htmlParse(response) # 提取第二个wikitable表格 tables <- getNodeSet(doc, "//table[contains(@class, 'wikitable')]") table_node <- tables[[2]] # 解析表格并处理列长度不一致问题 table_list <- readHTMLTable(table_node, stringsAsFactors = FALSE, fill = TRUE) if(is.list(table_list) && !is.data.frame(table_list)){ max_len <- max(sapply(table_list, length)) table_list <- lapply(table_list, function(x){ c(x, rep(NA, max_len - length(x))) }) wiki_df <- as.data.frame(table_list, stringsAsFactors = FALSE) }
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

