使用rvest无法从FDA页面选择带data-entity-substitution属性的元素
解决FDA页面动态元素抓取失败问题
问题根源
rvest::read_html()仅能获取页面的静态HTML源码,而你要抓取的带data-entity-substitution属性的元素,是页面加载后通过JavaScript动态渲染生成的——静态源码里根本不存在这个元素,所以直接调用html_element()会返回缺失值。
可行解决方案
方法1:用RSelenium模拟浏览器渲染完整页面
RSelenium可以启动真实浏览器加载页面并执行JS,拿到渲染后的完整HTML结构:
# 安装依赖包 install.packages("RSelenium") library(RSelenium) # 启动Chrome浏览器驱动(需提前安装对应版本的ChromeDriver) driver <- rsDriver(browser = "chrome", port = 4567L) remote_driver <- driver[["client"]] # 访问目标页面 remote_driver$navigate("https://www.fda.gov/drugs/drug-approvals-and-databases/drugsfda-data-files") # 获取渲染后的页面源码并解析 rendered_html <- remote_driver$getPageSource()[[1]] html_parsed <- rvest::read_html(rendered_html) # 定位目标元素并提取href属性 target_href <- rvest::html_element(html_parsed, "[data-entity-substitution]") %>% rvest::html_attr("href") # 关闭浏览器和驱动 remote_driver$close() driver$server$stop() print(target_href)
方法2:直接调用页面数据接口(更高效)
动态加载的内容通常由后台API提供,你可以通过浏览器开发者工具的「网络」面板,筛选XHR/fetch请求,找到返回下载链接的API接口,直接请求获取数据:
# 示例(需替换为实际找到的API地址) library(httr) api_url <- "https://www.fda.gov/api/drugsfda/data-files" response <- GET(api_url, add_headers("User-Agent" = "Mozilla/5.0")) data_content <- content(response, "parsed") # 根据实际返回的数据结构提取目标链接(此处为示例逻辑) target_href <- data_content$files[[406]]$download_url
方法3:用V8引擎执行页面JS生成元素
如果页面渲染逻辑不复杂,可以用V8引擎直接执行页面中的JS脚本,生成目标元素:
install.packages("V8") library(V8) library(rvest) # 获取静态HTML和页面中的JS脚本 static_html <- read_html("https://www.fda.gov/drugs/drug-approvals-and-databases/drugsfda-data-files") js_scripts <- html_elements(static_html, "script") %>% html_text() # 初始化V8环境并执行JS ctx <- v8() for(script in js_scripts) { try(ctx$eval(script), silent = TRUE) } # 获取渲染后的HTML并解析 rendered_html <- ctx$eval("document.documentElement.outerHTML") html_parsed <- read_html(rendered_html) # 提取目标链接 target_href <- html_element(html_parsed, "[data-entity-substitution]") %>% html_attr("href")
注意事项
- 使用RSelenium时,需保证ChromeDriver版本与本地Chrome浏览器版本一致,否则会启动失败。
- 调用API接口时,需携带合规的请求头(如
User-Agent),避免被网站拦截。
内容的提问来源于stack exchange,提问作者Yun
相关产品推荐
相关产品推荐

