如何用R(rvest)批量抓取CSI剧集维基页面的所有表格?
解决方法:循环遍历表格选择器并合并数据框
当然可以!其实你完全不用给每个表格选择器单独定义变量,把它们整理成一个字符向量,再结合purrr的循环函数,就能高效完成批量抓取并合并成单一DataFrame,具体代码和说明如下:
优化后的完整代码
library(rvest) library(dplyr) library(purrr) # 目标URL url <- "https://en.wikipedia.org/wiki/List_of_CSI:_Crime_Scene_Investigation_episodes" # 把所有表格选择器整理成一个字符向量(包含你注释的第17季表格) table_selectors <- c( '#mw-content-text > div > table:nth-child(14)', '#mw-content-text > div > table:nth-child(18)', '#mw-content-text > div > table:nth-child(22)', '#mw-content-text > div > table:nth-child(26)', '#mw-content-text > div > table:nth-child(30)', '#mw-content-text > div > table:nth-child(34)', '#mw-content-text > div > table:nth-child(38)', '#mw-content-text > div > table:nth-child(42)', '#mw-content-text > div > table:nth-child(46)', '#mw-content-text > div > table:nth-child(50)', '#mw-content-text > div > table:nth-child(54)', '#mw-content-text > div > table:nth-child(58)', '#mw-content-text > div > table:nth-child(62)', '#mw-content-text > div > table:nth-child(66)', '#mw-content-text > div > table:nth-child(70)', '#mw-content-text > div > table:nth-child(74)', '#mw-content-text > div > table:nth-child(79)' ) # 遍历所有选择器,抓取每个表格并合并 episodes <- table_selectors %>% map(function(selector) { url %>% read_html() %>% html_nodes(selector) %>% html_table(fill = TRUE) %>% pluck(1) }) %>% bind_rows() # 写入CSV文件(注意你之前代码里的`population`是笔误,应该用`episodes`) write.csv(episodes, file = "csi_episodes.csv", row.names = FALSE)
关键说明
- 把所有选择器放进向量
table_selectors,比单独定义变量简洁太多,也方便后续修改或增减 - 使用
map()函数遍历每个选择器,逐个抓取表格:pluck(1)是把html_table()返回的列表提取成单个数据框 bind_rows()会自动对齐列名,把所有表格纵向合并成一个大的DataFrame,完美解决多表格合并需求- 修正了你原代码里的小错误:
write.csv里的population应该是episodes,否则会报错
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

