使用rvest爬取Sports Reference大学篮球球员表格遇阻求助
解决rvest爬取Sports Reference大学篮球球员页面表格的问题
你的思路方向是对的——Sports Reference确实会把核心表格内容放在HTML注释里反爬,但细节处理上有几个坑导致代码失效,以下是修正后的完整方案,同时覆盖你需要的Advanced和Per 100 Poss两个表格:
修正后的代码
# 先安装并加载所需包(首次运行需安装) install.packages(c("rvest", "dplyr", "janitor")) library(rvest) library(dplyr) library(janitor) # 目标页面URL ad_url <- 'https://www.sports-reference.com/cbb/players/anthony-davis-5.html' # 解析页面,提取包含表格的注释内容 page_content <- read_html(ad_url) parsed_html <- page_content %>% # 只提取包含表格的注释,避免冗余内容干扰解析 html_nodes(xpath = "//comment()[contains(., 'table')]") %>% html_text() %>% paste(collapse = "") %>% read_html() # 提取Advanced表格 advanced_df <- parsed_html %>% html_node("#advanced") %>% html_table(header = TRUE, fill = TRUE) %>% # 清理列名并过滤无效行 clean_names() %>% filter(!is.na(season)) # 提取Per 100 Poss表格(注意表格ID是per_poss) per_100_poss_df <- parsed_html %>% html_node("#per_poss") %>% html_table(header = TRUE, fill = TRUE) %>% clean_names() %>% filter(!is.na(season))
关键修正点
- 精准提取注释:原代码提取所有HTML注释,其中包含大量无关内容,可能导致解析失败。改用
//comment()[contains(., 'table')]只抓取包含表格的注释,提升解析稳定性。 - 表格ID对应:"Per 100 Poss"表格的HTML实际ID是
#per_poss,不是直观的per_100_poss,这是容易踩的命名坑。 - 表格清理:Sports Reference的表格默认有两行表头和底部汇总行,用
clean_names()统一列名格式,filter(!is.na(season))过滤掉无效空行和汇总行。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

