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

