使用rvest爬取Freeride World Tour嵌套表格分站赛得分遇阻
解决Freeride World Tour分站赛得分提取问题
嘿,别担心!作为网页爬虫新手,遇到这种嵌套数据提取的问题太正常了~我来一步步帮你搞定各分站赛(heat)的得分提取。
问题根源分析
你之前用SelectorGadget可能只抓取了全局的元素(比如选手名、总分),但分站得分是绑定在每个选手的行内的多个元素,需要先定位到每个选手的行,再从行内提取对应得分,而不是直接全局选择。
具体代码实现
先确保你加载了必要的R包:
library(rvest) library(dplyr) library(purrr)
1. 读取目标网页
# 目标排名页面URL url <- "https://www.freerideworldtour.com/rankings-detailed?season=165&competition=2&discipline=38" page <- read_html(url)
2. 提取基础信息(选手名、总分)
先把你已经能拿到的信息提取出来:
# 提取选手姓名 rider_names <- page %>% html_elements(".ranking-table__name") %>% html_text2() # html_text2()会自动处理多余的空格换行 # 提取总得分 total_scores <- page %>% html_elements(".ranking-table__total-score") %>% html_text2() %>% as.numeric() # 转成数值类型方便后续分析
3. 提取分站赛得分(核心步骤)
这里我们先定位到每个选手对应的行,再从每行里提取所有分站得分:
# 获取所有选手的行元素 rider_rows <- page %>% html_elements(".ranking-table__row") # 遍历每行,提取该行内的所有分站得分 heat_scores_list <- rider_rows %>% map(function(row) { row %>% html_elements(".ranking-table__heat-score") %>% # 定位行内的分站得分单元格 html_text2() %>% as.numeric() # 转成数值,未参赛的选手会自动转为NA }) # 将列表转为数据框,并重命名列(比如Heat_1, Heat_2...) heat_scores_df <- heat_scores_list %>% do.call(rbind, .) %>% as.data.frame() %>% setNames(paste0("Heat_", 1:ncol(.)))
4. 合并所有数据
把选手名、总分和分站得分合并成一个完整的数据框:
final_rankings <- tibble( Rider_Name = rider_names, Total_Score = total_scores ) %>% bind_cols(heat_scores_df) # 查看结果 head(final_rankings)
新手小技巧
- 别依赖单一工具:SelectorGadget虽然方便,但遇到嵌套结构时,Chrome开发者工具(按F12打开)更靠谱——右键点击分站得分单元格,选择「检查」,就能看到它的父元素(选手行)和自身的class,精准定位选择器。
- 检查元素结构:确认每个分站得分的class是
.ranking-table__heat-score,如果网站更新了class名,你可以用开发者工具重新查看更新。
内容的提问来源于stack exchange,提问作者Matthew J. Oldach
相关产品推荐
相关产品推荐

