【问题标题】:Webscrape multiple tables with R (rvest)使用 R (rvest) 抓取多个表
【发布时间】:2019-10-09 15:25:13
【问题描述】:

我正在尝试为 CSI 抓取 wiki 页面上的所有表格:https://en.wikipedia.org/wiki/List_of_CSI:_Crime_Scene_Investigation_episodes 到目前为止一切顺利,我已经能够用下面的代码刮一张桌子(第 1 季), 是否有一个 for 循环可以遍历所有表,因为它们具有相同的类?

这是我的 R 代码

library(rvest)
url <- "https://en.wikipedia.org/wiki/List_of_CSI:_Crime_Scene_Investigation_episodes"
episodes <- url %>%
  read_html() %>%
  html_nodes('#mw-content-text > div > table:nth-child(14)') %>%
  html_table()
episodes <- episodes[[1]]

更新我刚刚意识到每个表选择器都有一个不同的第 n 个子选择器,所以我决定将每个表选择器分配给如下所示的变量。我现在可以遍历每个表并将结果分配给一个 DF/变量“情节”吗 调整代码:

library(dplyr)
library(purrr)
url <- "https://en.wikipedia.org/wiki/List_of_CSI:_Crime_Scene_Investigation_episodes"
table1<- '#mw-content-text > div > table:nth-child(14)'
table2<- '#mw-content-text > div > table:nth-child(18)'
table3<- '#mw-content-text > div > table:nth-child(22)'
table4<- '#mw-content-text > div > table:nth-child(26)'
table5<- '#mw-content-text > div > table:nth-child(30)'
table6<- '#mw-content-text > div > table:nth-child(34)'
table7<- '#mw-content-text > div > table:nth-child(38)'
table8<- '#mw-content-text > div > table:nth-child(42)'
table9<- '#mw-content-text > div > table:nth-child(46)'
table10<- '#mw-content-text > div > table:nth-child(50)'
table11<- '#mw-content-text > div > table:nth-child(54)'
table12<- '#mw-content-text > div > table:nth-child(58)'
table13<- '#mw-content-text > div > table:nth-child(62)'
table14<- '#mw-content-text > div > table:nth-child(66)'
table15<- '#mw-content-text > div > table:nth-child(70)'
table16<- '#mw-content-text > div > table:nth-child(74)'
#table17<- '#mw-content-text > div > table:nth-child(79)'
episodes <- url %>%
  read_html() %>%
  html_nodes(table1) %>%
  html_table(fill = T)
episodes <- episodes[[1]]

write.csv(population, file = "test.csv")

【问题讨论】:

  • 你到底是什么意思?你想为每个季节刮桌子吗?
  • 是的,如果可能的话,我想要一个数据框中的每个季节的表格。到目前为止,我一次可以刮一张桌子。

标签: r web-scraping rvest scrape


【解决方案1】:

如果我理解正确,您要做的是将除第一个表之外的所有表放入一个数据框中,该表列出了季节并具有不同的列名。

假设您已经安装了purrrdplyr(都是tidyverse 的一部分),以下应该可以实现您想要的:首先提取所有表,然后将所有表(除第一个)放在一个单一的数据框。

library(rvest)

url <- "https://en.wikipedia.org/wiki/List_of_CSI:_Crime_Scene_Investigation_episodes"

episodes <- url %>%
  read_html() %>%
  html_nodes("table") %>%
  html_table(fill = TRUE)

purrr::map_dfr(episodes[-1], dplyr::bind_rows)

为了澄清,第一个命令管道创建了一个包含所有表的数据框列表。

map_dfr 告诉它遍历给定的列表并输出一个数据框。

【讨论】:

  • 感谢您的评论,但到目前为止我已经尝试过了,但没有成功。退回了一堆 NA。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2019-02-16
  • 2020-06-08
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多