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

使用rvest包爬取NCAA冰球数据时XPath定位表格返回空列表求助

问题原因

rvest::read_html()只能抓取网页初始返回的静态HTML源码,你要爬的NCAA逐回合赛事数据是页面加载后由JavaScript动态拉取、渲染生成的,静态请求拿到的源码里根本不存在play-by-play-period容器、赛事表格这些节点。你从浏览器复制的XPath是JS执行完成、DOM完全渲染后生成的路径,静态爬取时自然匹配不到任何内容,最终返回空列表。

解决方法

方案1:直接调用后端数据接口(推荐,稳定性和效率最高)

不用硬解析HTML结构,页面渲染用的逐回合数据是从站点内部接口拉取的结构化JSON数据,直接请求接口拿数据比解析HTML省事很多:

  • 打开目标页面,按F12调出开发者工具,切换到「网络」面板,筛选Fetch/XHR类型请求
  • 刷新页面,在请求列表里找名称包含play-by-play的请求,在响应预览里确认是逐回合数据后,复制该请求的地址
  • 用httr包发起GET请求获取响应,再用jsonlite包解析返回的JSON,就能直接拿到结构化的赛事数据,不需要写复杂的节点匹配规则。

方案2:渲染页面后再解析HTML

如果需要走HTML解析的逻辑,要先通过模拟浏览器工具执行完页面JS,等所有DOM节点渲染完成后再提取内容:

  • 安装加载RSelenium包,配置好对应浏览器的驱动,启动无头浏览器实例
  • 驱动浏览器访问目标URL,等待3-5秒让页面完成数据加载和渲染
  • 提取渲染完成后的页面源码,再用rvest做节点匹配即可。
  • 节点匹配不要用你之前写的那种逐层写div序号的长绝对XPath,只要页面结构稍微调整(比如多插一个广告位、调整布局容器顺序)就会直接失效,优先用class属性写更稳定的CSS选择器,参考代码如下:
# 需提前完成RSelenium驱动配置、启动浏览器实例后运行
remDr$navigate(target_url)
# 等待页面渲染完成
Sys.sleep(3)
rendered_page <- remDr$getPageSource()[[1]]
# 匹配所有节次的容器
period_nodes <- read_html(rendered_page) %>%
  html_elements(css = "div.play-by-play-period")
# 遍历提取每节的表格数据
pbp_dataset <- lapply(period_nodes, function(node){
  node %>%
    html_element(css = "table") %>%
    html_table()
})
避坑提醒
  • 写爬取规则前,先把静态抓取到的源码保存到本地打开检查,确认目标节点确实存在于你抓到的内容里,不要对着浏览器里渲染完成的页面写静态爬取的匹配规则,做无用功
  • 尽量避免使用浏览器右键复制的绝对XPath,优先基于元素的class、id等固定属性写相对路径的选择器,容错率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:48:17