使用read_html抓取Fangraphs表格:如何定位目标元素?
解决Fangraphs数据抓取中定位目标表格的问题
问题原因
Fangraphs页面包含多个表格(包括下拉菜单中的隐藏表格),直接使用html_nodes("table")会返回所有表格,指定固定序号极易出错,且部分隐藏表格仅含表头无数据。
可靠定位方案
以下几种方式可精准定位主数据表格:
1. 基于表头文本+非隐藏属性的XPath定位
通过筛选包含目标表头(如Name)且未被隐藏的表格,避免抓取到下拉菜单中的空表:
library(rvest) url <- "https://www.fangraphs.com/leaders/major-league?pos=all&stats=pit&lg=all&season=2024&season1=2024&ind=0&qual=1&pageitems=2000000000&v_cr=202301&type=c%2C7%2C31%2C13%2C16%2C24%2C19%2C15%2C212&month=0" page <- read_html(url) # 定位包含Name表头且非隐藏的主表 target_table <- html_node(page, xpath = "//table[not(contains(@style, 'display:none')) and .//th[text()='Name']]") player_stats <- html_table(target_table) print(player_stats)
2. 基于父容器的定位
主数据表格通常包裹在特定的容器中(如table-wrapper类的div),通过父容器筛选更稳定:
target_table <- html_node(page, xpath = "//div[contains(@class, 'table-wrapper')]/table") player_stats <- html_table(target_table)
3. 基于表格Class的CSS选择器
Fangraphs使用RadGrid组件,主表通常带有rgMasterTable类,直接通过CSS选择器定位:
target_table <- html_node(page, css = "table.rgMasterTable") player_stats <- html_table(target_table)
注意事项
- 避免使用固定表格序号,页面结构更新时序号会变化,导致抓取失效。
- 当前URL返回的是静态HTML表格,上述方法可直接生效;若后续页面改为动态加载,可能需要结合
RSelenium或playwright等工具模拟浏览器渲染。
内容的提问来源于stack exchange,提问作者Aaron Wood
相关产品推荐
相关产品推荐

