【发布时间】:2020-06-27 21:10:15
【问题描述】:
我是网络抓取的新手,在抓取网站内的多个页面时遇到困难。感谢社区的任何反馈!
目标:从 2019 年 cfbstats.com 抓取每个团队的统计数据,并将每个团队的数据放入一个数据框或自定义团队数据框。
操作: 在下面的代码中,我编写了一个 html 调用,将每个团队(小示例)的唯一标识符粘贴到 html 代码中。之后,我使用 lapply 函数和 rvest 来提取每个团队的数据。最后,使用 rbind 和 do.call 来加入所有的 pulls。
问题:在@Dave2e 的帮助下,我意识到 rbind 合并所有被抓取的数据表时遇到了问题。从网络抓取中加入数据表有什么建议吗? match.names(clabs, names(xi)) 中的错误: 名字与以前的名字不匹配
library(tidyverse)
library(rvest)
team_id <- c(721, 5, 8)
teams <- paste('http://cfbstats.com/2019/team/', team_id, '/index.html', sep = "")
df_team_stats <- lapply(teams, function(i){
webpage <- read_html(i)
team_table <- html_nodes(webpage, '.team-statistics')
overall_stats <- html_table(team_table)[[1]]
})
finaldf <- do.call(rbind, df_team_stats)
【问题讨论】:
-
有 2 个不同的节点,“class= team-statistics”。您只希望 CSS 等于“table”和 class= team-statistics。因此正确的调用是:
html_nodes(webpage, 'table.team-statistics') -
谢谢@Dave2e!这有助于我更接近解决方案。非常感激。插入您的建议后,我发现我的 rbind 存在一些问题。 'match.names(clabs, names(xi)) 中的错误:名称与以前的名称不匹配。
-
使用 dplyr 包中的
bind_rows()函数。它是do.call(rbind, ...)的替代品,而且它具有列名匹配的好处。 -
@Dave2e 另一个很棒的电话。非常感谢您的所有帮助!
标签: r web-scraping lapply rvest