使用R爬取2022赛季Norfolk Tides棒球数据遇问题求协助
问题排查与解决方案
问题原因
你的代码核心问题是选择器定位错误:.scrolling-table是包裹表格的<div>容器,而非表格本身。直接对div调用html_table()会导致解析异常,仅返回列名和空行。另外,页面表格存在合并单元格(比如月份分组行),默认的html_table()参数无法处理这类结构。
解决方案一:修正选择器并处理合并单元格
使用更精确的选择器定位表格,同时开启fill=TRUE参数填充合并单元格的缺失值:
library(rvest) library(dplyr) url = "https://www.baseballamerica.com/teams/3181/norfolk-tides/schedule/?year=2022" # 修正选择器,定位到div内部的table元素 data <- url %>% read_html() %>% html_element(".scrolling-table table") %>% html_table(fill = TRUE) # fill=TRUE处理合并单元格 # 过滤掉空行(比如月份标题行) clean_data <- data %>% filter(!is.na(Date) & Date != "Date") head(clean_data)
解决方案二:手动提取列信息(更灵活)
如果html_table()仍有解析问题,可以手动定位每一列的元素,提取文本后合并为数据框,html_text2()能自动清理换行和多余空格:
library(rvest) library(dplyr) url = "https://www.baseballamerica.com/teams/3181/norfolk-tides/schedule/?year=2022" page <- read_html(url) # 提取各列数据 dates <- page %>% html_elements(".scrolling-table table tbody tr td:nth-child(1)") %>% html_text2() times <- page %>% html_elements(".scrolling-table table tbody tr td:nth-child(2)") %>% html_text2() opponents <- page %>% html_elements(".scrolling-table table tbody tr td:nth-child(3)") %>% html_text2() scores <- page %>% html_elements(".scrolling-table table tbody tr td:nth-child(4)") %>% html_text2() locations <- page %>% html_elements(".scrolling-table table tbody tr td:nth-child(5)") %>% html_text2() # 合并为数据框并过滤无效行 schedule_df <- data.frame( Date = dates, Time = times, Opponent = opponents, Score = scores, Location = locations ) %>% filter(Date != "Date") # 移除表头重复行 head(schedule_df)
额外说明
如果上述方法仍返回空数据,说明页面内容是JavaScript动态加载的,此时需要用RSelenium或playwright模拟浏览器渲染页面后再抓取。不过测试该URL时,静态源码已包含完整赛程,所以前两种方法即可解决问题。
内容的提问来源于stack exchange,提问作者econ221
相关产品推荐
相关产品推荐

