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

使用rvest抓取Sofascore法甲积分榜时指定div类名返回空节点集

问题:使用rvest抓取Sofascore法甲22/23赛季积分榜时无法获取目标div节点内容

想要使用rvest包抓取Sofascore网站上22/23赛季法甲的“Standings”积分榜表格。已知可通过类名读取HTML文本,但指定目标<div>的类名“sc-hLBbgP sc-eDvSVe gjJmZQ fRddxb sc-526d246a-0 evdGB”后,调用html_elements()返回空节点集{xml_nodeset (0)}。此前仅读取<div>元素时可正常获取HTML代码,请问为何无法获取该

节点中的文本信息?

当前代码:

library(rvest)

URL <- "https://www.sofascore.com/tournament/football/france/ligue-1/34#42273"
HTML <- read_html(URL)

HTML %>%
  html_elements("div") %>%
  html_elements(".sc-hLBbgP sc-eDvSVe gjJmZQ fRddxb sc-526d246a-0 evdGB")

原因分析及解决方案

核心原因

  1. 动态内容渲染限制:Sofascore的积分榜内容是通过JavaScript动态加载的,read_html()只能获取页面初始的静态HTML,无法捕获JS执行后生成的DOM节点,这是最主要的问题。
  2. CSS选择器语法错误:多个类名的CSS选择器需要用.连接(表示元素同时拥有这些类),你代码中的空格是后代选择器语法,会被解析为“寻找拥有sc-hLBbgP类的元素下的sc-eDvSVe类元素”,而非同时包含所有指定类的div。
  3. 动态类名不可靠:你使用的类名(如sc-hLBbgP、gjJmZQ)是前端框架生成的动态类名,这类名称会随网站更新、版本迭代变化,不能作为稳定的定位依据。

解决方案

方案1:使用动态页面抓取工具(RSelenium/playwright)

这类工具可以模拟浏览器执行JS,获取完整渲染后的页面内容。以RSelenium为例:

library(RSelenium)
library(rvest)

# 启动Chrome浏览器驱动(需提前配置好ChromeDriver环境)
driver <- rsDriver(browser = "chrome")
remDr <- driver[["client"]]

# 访问目标页面
remDr$navigate("https://www.sofascore.com/tournament/football/france/ligue-1/34#42273")
# 等待页面加载完成(可根据网络情况调整等待时间)
Sys.sleep(3)

# 获取渲染后的完整页面源码
page_source <- remDr$getPageSource()[[1]]
HTML <- read_html(page_source)

# 改用更稳定的定位方式,比如通过文本或结构定位积分榜板块
standings_div <- HTML %>% html_elements(xpath = "//div[contains(text(), 'Standings')]/../..")

# 关闭浏览器驱动
remDr$close()
driver$server$stop()

方案2:调用Sofascore官方API(推荐)

网站的积分榜数据通常来自API接口,直接请求API比抓取页面更高效稳定。通过浏览器开发者工具可找到对应的API链接,示例代码如下:

library(jsonlite)
library(dplyr)

# 22/23赛季法甲积分榜API链接(可通过浏览器网络请求捕获)
api_url <- "https://api.sofascore.com/api/v1/tournament/34/season/42273/standings"

# 请求并解析API数据
response <- fromJSON(api_url)
standings_data <- response$standings[[1]]$rows

# 转换为数据框并整理关键字段
standings_df <- standings_data %>%
  select(position, team, played, wins, draws, losses, goalsFor, goalsAgainst, points) %>%
  mutate(team_name = team$name) %>%
  select(-team)

print(standings_df)

内容的提问来源于stack exchange,提问作者anyway01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:02:36