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

使用R的rvest包结合XPath抓取动态大学排名表格遇阻求助

解决动态表格抓取问题

问题原因

目标页面的排名表格由JavaScript动态渲染,rvest仅能抓取静态初始HTML,无法获取JS加载后的内容,这是代码失败的核心原因。

解决方案1:使用RSelenium模拟浏览器渲染

RSelenium可以模拟真实浏览器加载页面,获取完整渲染后的HTML,再用rvest解析表格。

步骤与代码

  1. 安装并加载所需包
install.packages(c("RSelenium", "rvest", "dplyr"))
library(RSelenium)
library(rvest)
library(dplyr)
  1. 启动Chrome浏览器驱动(需确保本地已安装Chrome和对应版本的ChromeDriver)
driver <- rsDriver(browser = "chrome", port = 4567L)
remDr <- driver[["client"]]
  1. 访问目标页面并等待加载完成
remDr$navigate("https://www.topuniversities.com/university-rankings/university-subject-rankings/2023/arts-humanities?&tab=indicators")
# 等待表格加载,可根据网络情况调整等待时间
Sys.sleep(5)
  1. 获取渲染后的页面源码,解析表格
page_source <- remDr$getPageSource()[[1]]
rank_table <- read_html(page_source) %>%
  html_element(xpath = '//table[contains(@class, "ranking-table")]') %>%
  html_table(header = TRUE)
  1. 关闭浏览器驱动
remDr$close()
driver$server$stop()

解决方案2:使用rvest结合V8解析JS数据

部分动态页面会通过JS接口加载数据,可直接提取页面中的JS数据,用V8引擎解析后转为数据框。

步骤与代码

  1. 安装并加载所需包
install.packages(c("rvest", "V8", "jsonlite"))
library(rvest)
library(V8)
library(jsonlite)
  1. 获取静态页面源码,提取包含排名数据的JS脚本
page <- read_html("https://www.topuniversities.com/university-rankings/university-subject-rankings/2023/arts-humanities?&tab=indicators")
js_script <- page %>%
  html_elements(xpath = '//script[contains(text(), "rankingsData")]') %>%
  html_text()
  1. 清理JS脚本,提取JSON数据并解析
# 提取rankingsData对应的JSON部分
json_data <- stringr::str_extract(js_script, 'rankingsData\\s*=\\s*(\\{.*?\\});') %>%
  stringr::str_replace('rankingsData\\s*=\\s*', '') %>%
  stringr::str_remove(';$')

# 用V8解析JSON
ctx <- v8()
ctx$eval(paste0('var data = ', json_data))
rank_data <- ctx$get("data")

# 将数据转为数据框
rank_df <- as.data.frame(rank_data$data)

注意事项

  • 使用RSelenium时,需确保ChromeDriver版本与本地Chrome版本匹配,否则会启动失败。
  • 第二种方法依赖页面JS结构的稳定性,若网站更新JS代码,可能需要调整提取规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:33:19