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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:25:28