【问题标题】:Trying to use rvest to loop a command to scrape tables from multiple pages尝试使用 rvest 循环命令以从多个页面中抓取表格
【发布时间】:2017-07-10 10:28:32
【问题描述】:

我正在尝试从不同的足球队抓取 HTML 表格。这是我要抓取的表格,但是我想从所有团队抓取同一张表格,最终创建一个包含球员姓名及其数据的单个 CSV 文件。

http://www.pro-football-reference.com/teams/tam/2016_draft.htm

# teams
teams <- c("ATL", "TAM", "NOR", "CAR", "GNB", "DET", "MIN", "CHI", "SEA", "CRD", "RAM", "NWE", "MIA", "BUF", "NYJ", "KAN", "RAI", "DEN", "SDG", "PIT", "RAV", "SFO", "CIN", "CLE", "HTX", "OTI", "CLT", "JAX", "DAL", "NYG", "WAS", "PHI")

# loop
for(i in teams) {
  url <-paste0("http://www.pro-football-reference.com/teams/", i,"/2016-snap-counts.htm#snap_counts::none", sep="")
  webpage <- read_html(url)

  # grab table
  sb_table <- html_nodes(webpage, 'table')
html_table(sb_table)
head(sb_table)
  # bind to dataframe
df <- rbind(df, sb_table)
}

我收到一个错误,认为我应该使用 CSS 或 Xpath 而不是两者都使用,但我无法确定问题的确切位置(我怀疑 html_nodes 命令)。谁能帮我解决这个问题?

【问题讨论】:

  • df 来自哪里?
  • 根据您的示例网址,teams 中的缩写不应该是小写吗?
  • 您需要在循环之外定义df&lt;-data.frame(),否则您将在每次迭代时覆盖它。
  • “除非本段特别规定,您同意不使用或启动任何访问本网站的自动化系统,包括但不限于机器人、蜘蛛、离线阅读器或类似设备以一种在任何给定时间段内向站点服务器发送的请求消息比普通人在同一时间段内通过使用传统的在线 Web 浏览器阅读、查看和提交材料时通常产生的请求消息更多的方式。SRL 保留撤销本段中授予的例外的权利”

标签: r web-scraping rvest


【解决方案1】:

我认为您的网址构建不当,此外,团队的名称区分大小写。你可以试试这样吗?

library(rvest)
library(magrittr)

# teams
teams <- c("ATL", "TAM", "NOR", "CAR", "GNB", "DET", "MIN", "CHI", "SEA", "CRD", "RAM", "NWE", "MIA", "BUF", "NYJ", "KAN", "RAI", "DEN", "SDG", "PIT", "RAV", "SFO", "CIN", "CLE", "HTX", "OTI", "CLT", "JAX", "DAL", "NYG", "WAS", "PHI")

tables <- list()
index <- 1
for(i in teams){
  try({
  url <- paste0("http://www.pro-football-reference.com/teams/", tolower(i), "/2016_draft.htm")
  table <- url %>% 
    read_html() %>% 
    html_table(fill = TRUE)

  tables[index] <- table

  index <- index + 1

  })
}

df <- do.call("rbind", tables)

PS:我不明白为什么这个问题被否决了。它似乎制定得很好......

【讨论】:

    【解决方案2】:

    我认为在这种情况下合适的 CSS 选择器是 #snap_counts。此外,如果每页有一个表,您可以使用html_node()(单数,而不是节点):

    url %>% 
      read_html() %>% 
      html_node("#snap_counts") %>% 
      html_table(header = FALSE)
    

    由于表格有两个标题行,并且一些标题单元格跨列,因此最好使用header = FALSE。数据框的前 2 行将包含标题,您可以手动清理(创建自己的列名)。

    【讨论】:

    • 代码对我有用。很高兴讨论否决票的原因:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多