使用rvest和SelectorGadget爬取网页表格返回空表,求替代方案
解决方案
问题分析
- 选择器错误:你用的
#main li是列表容器,不是表格元素,直接提取会找不到表格;且原代码中html_table直接传入整个页面对象,没有定位到实际的表格节点。 - 反爬/动态加载:该网站可能通过检测请求头(如缺失浏览器
User-Agent)或动态渲染(JS生成表格)阻止静态爬取,导致返回空内容。
方法1:添加请求头的静态爬取(优先尝试)
通过httr设置浏览器请求头,模拟正常访问,再用rvest定位表格节点:
library(rvest) library(httr) # 模拟Chrome浏览器请求头 ua <- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" # 发送带UA的请求 response <- GET( url = "https://pershingsquareholdings.com/performance/net-asset-value-and-returns/", user_agent(ua) ) # 解析页面并提取所有表格 psh <- read_html(response) psh_tables <- html_elements(psh, "#main li table") %>% lapply(html_table, fill = TRUE) # 查看结果 str(psh_tables)
方法2:动态渲染爬取(静态方法失效时用)
如果表格是JS动态生成的,用RSelenium模拟真实浏览器加载页面:
library(RSelenium) library(rvest) # 启动Chrome浏览器(需提前安装ChromeDriver并配置环境变量) driver <- rsDriver(browser = "chrome", port = 4567L) remote_driver <- driver[["client"]] # 访问目标页面并等待加载 remote_driver$navigate("https://pershingsquareholdings.com/performance/net-asset-value-and-returns/") Sys.sleep(3) # 等待JS渲染完成 # 获取页面源码并解析 page_source <- remote_driver$getPageSource()[[1]] psh <- read_html(page_source) psh_tables <- html_elements(psh, "#main li table") %>% lapply(html_table, fill = TRUE) # 关闭浏览器 remote_driver$close() driver$server$stop() # 查看结果 str(psh_tables)
关键注意事项
- 用
html_elements(复数形式)提取多个表格,html_node只会返回第一个匹配项。 - 若使用
RSelenium,需提前安装对应版本的ChromeDriver,且Chrome浏览器版本需与Driver匹配。
内容的提问来源于stack exchange,提问作者Webko Wuite
相关产品推荐
相关产品推荐

