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

R语言抓取维基百科双表头表格问题求助

解决维基百科S&P系列指数变动表格双表头抓取问题

针对你遇到的双表头、单元格合并导致第二行被识别为数据的问题,给你一套具体的R代码处理方案,步骤如下:

1. 加载所需工具包

先确保安装并加载网页抓取和数据处理的必要包:

# 首次运行需安装包
install.packages(c("rvest", "dplyr"))

# 加载包
library(rvest)
library(dplyr)

2. 抓取网页并定位目标表格

以S&P 500的变动页面为例,先获取页面内容,定位到变动记录的目标表格:

# 目标页面URL
url <- "https://en.wikipedia.org/wiki/List_of_S%26P_500_companies#Changes_to_the_list"
page <- read_html(url)

# 定位变动记录表格(通常是页面内第二个带wikitable sortable类的表格,可根据实际调整)
change_table <- page %>% html_element("table.wikitable.sortable:nth-of-type(2)")

3. 处理双表头与合并单元格

这类表格第一行是大分类、第二行是子项,部分单元格跨两行合并,需要手动合并表头文本:

# 提取前两行表头
header_rows <- change_table %>% html_elements("tr") %>% .[1:2]

# 分别提取两行的表头文本
header_top <- header_rows[[1]] %>% html_elements("th") %>% html_text2()
header_bottom <- header_rows[[2]] %>% html_elements("th") %>% html_text2()

# 合并表头:第一行非空文本和第二行对应文本拼接,空的直接用第二行文本
combined_header <- mapply(function(top, bottom) {
  if (top != "") paste(top, bottom, sep = " - ") else bottom
}, header_top, header_bottom)

# 清理多余空格
combined_header <- trimws(combined_header)

4. 提取数据并设置表头

跳过前两行表头,提取实际数据并应用合并后的表头:

# 提取数据行(跳过前两行表头)
data_rows <- change_table %>% html_elements("tr") %>% .[-c(1,2)]

# 转换为数据框
change_data <- data_rows %>% html_table(header = FALSE) %>% bind_rows()

# 设置合并后的表头
colnames(change_data) <- combined_header

5. 筛选2017年以来的数据

转换日期格式后,过滤出2017年及以后的记录:

# 转换日期列格式(表头名根据实际合并结果调整)
change_data <- change_data %>% mutate(`Date - Date` = as.Date(`Date - Date`, format = "%B %d, %Y"))

# 筛选2017年1月1日之后的数据
post_2017_data <- change_data %>% filter(`Date - Date` >= as.Date("2017-01-01"))

适配S&P 400/600的调整

只需替换目标URL即可:

  • S&P 400:https://en.wikipedia.org/wiki/List_of_S%26P_400_companies#Changes
  • S&P 600:https://en.wikipedia.org/wiki/List_of_S%26P_600_companies#Changes

注意:如果不同页面的表格位置、表头文本有差异,需根据实际页面调整代码中的表格选择器和表头处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:10:06