R使用rvest爬取PGA Tour大学排名表格时CSS选择器不生效问题
问题解决:PGA大学排名页面表格爬取空结果问题
问题根源
你使用read_html()获取内容后匹配不到目标td节点,核心原因是该页面的排名表格为JavaScript动态渲染生成的内容。read_html()只能拉取服务器返回的初始静态HTML代码,这部分静态内容中还没有加载出你要的.rank、.player、.name类的表格节点,因此选择器返回空字符结果。
可行解决方案(基于RSelenium动态渲染)
通过模拟浏览器运行的方式等待页面JS渲染完表格内容后再提取数据,和你原本的rvest操作逻辑兼容,学习成本更低:
1. 安装依赖包
install.packages(c("RSelenium", "rvest", "dplyr", "stringr"))
2. 可运行爬取代码
library(RSelenium) library(rvest) library(dplyr) library(stringr) # 启动Chrome浏览器驱动,chromever参数填你本地Chrome的对应版本号 driver <- rsDriver(browser = "chrome", chromever = "你的Chrome版本号", verbose = FALSE) remDr <- driver$client # 访问目标页面 remDr$navigate("https://www.pgatour.com/university/full-ranking.html") # 等待页面加载完成,网络较慢可适当调大数值 Sys.sleep(3) # 获取渲染完成的完整页面源码 page_source <- remDr$getPageSource()[[1]] pgaU <- read_html(page_source) # 按你找到的类名分别提取三列内容,去除多余空白符 rank <- html_nodes(pgaU, ".rank") %>% html_text() %>% str_trim() player <- html_nodes(pgaU, ".player") %>% html_text() %>% str_trim() university <- html_nodes(pgaU, ".name") %>% html_text() %>% str_trim() # 合并为规范的数据框 pga_rank <- data.frame( Rank = rank, Player = player, University = university ) # 运行完成后关闭浏览器和驱动进程 remDr$close() driver$server$stop() # 输出前几行验证结果 head(pga_rank)
补充说明
你可以在Chrome地址栏输入chrome://version/查看第一行的版本号,填入chromever参数即可。如果不需要保留浏览器运行过程,也可以给rsDriver添加extraCapabilities = list(chromeOptions = list(args = c('--headless', '--disable-gpu')))参数启用无头模式,后台静默运行。
内容的提问来源于stack exchange,提问作者dreamweaver
相关产品推荐
相关产品推荐

