You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:21:05