You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

新手小技巧

  1. 别依赖单一工具:SelectorGadget虽然方便,但遇到嵌套结构时,Chrome开发者工具(按F12打开)更靠谱——右键点击分站得分单元格,选择「检查」,就能看到它的父元素(选手行)和自身的class,精准定位选择器。
  2. 检查元素结构:确认每个分站得分的class是.ranking-table__heat-score,如果网站更新了class名,你可以用开发者工具重新查看更新。

内容的提问来源于stack exchange,提问作者Matthew J. Oldach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:57:54