R语言使用XML包读取HTML网站表格报错及多赛季数据爬取咨询
问题1解答
- 核心错误原因:你要爬取的NBA stats站点表格是JavaScript动态渲染的,直接发起HTTP请求拿到的原始HTML源码中没有完整的表格节点数据,XML包的
readHTMLTable只能解析静态HTML内容,无法处理前端动态加载的数据,所以该方案本身不适用当前场景。此外你的代码存在笔误:参数是stringsAsFactors而非stringAsFactors,不过这不是触发本次报错的核心原因。 - XML包不适用于该场景,它仅支持静态HTML/XML解析,无法处理依赖JS渲染的动态页面内容。
问题2解答
报错的逻辑链是:
- 最先触发的警告
XML content does not seem to be XML: 'Season'是因为你请求返回的原始内容不是标准的XML/静态HTML结构,readHTMLTable解析失败返回了NULL值。 - 后续的报错
unable to find an inherited method for function ‘readHTMLTable’ for signature ‘"NULL"’是因为readHTMLTable接收到的输入值为NULL,没有对应处理NULL输入的方法,所以抛出该错误。
问题3解答
最高效的方案是直接调用站点的后端数据接口,无需解析前端页面:
- 打开浏览器控制台的网络面板,筛选XHR请求,切换赛季时可以抓到对应的官方数据接口,接口参数中
Season对应赛季值,SeasonType对应常规赛/季后赛类型。 - 首先生成2004-05到2020-21的赛季参数列表,可通过
paste0(2004:2020, "-", substr(2005:2021, 3, 4))快速生成。 - 用
httr包循环遍历每个赛季参数发起请求,拿到返回的JSON数据后用jsonlite包解析为数据框即可,批量请求时注意添加1-2秒的间隔,避免请求频率过高被站点限制IP。 - 如果你需要模拟前端操作,也可以用
RSelenium或rvest配合无头浏览器加载页面,等JS渲染完成后再提取表格,但该方案效率远低于直接调用接口。
内容的提问来源于stack exchange,提问作者LoveMYMAth
相关产品推荐
相关产品推荐

