如何用R爬取USDA FoodData Central营养表?解决xml_missing问题
解决R语言爬取USDA营养表时的xml_missing错误
错误原因
你遇到的xml_missing错误是因为目标页面属于单页应用(SPA),营养表内容是通过JavaScript动态渲染生成的。rvest::read_html()只能抓取页面初始的静态HTML,此时#nutrients-table元素还未被加载,自然无法定位到对应节点。
解决方案
方案1:调用USDA FDC API(推荐,更稳定合规)
USDA官方提供了FoodData Central API,直接请求API比爬取动态页面更可靠,也符合网站使用规范。
- 先在USDA FDC开发者页面申请免费API密钥
- 使用以下代码获取营养数据:
library(httr) library(jsonlite) library(tidyverse) # 替换为你的API密钥 api_key <- "你的API密钥" fdc_id <- 2237774 # 对应目标页面的食物ID # 构造API请求地址 api_url <- paste0("https://api.nal.usda.gov/fdc/v1/food/", fdc_id, "?api_key=", api_key) # 发送请求并解析数据 response <- GET(api_url) food_data <- fromJSON(content(response, as = "text")) # 提取并整理营养信息为数据框 nutrients_df <- food_data$foodNutrients %>% select(nutrientName, nutrientNumber, unitName, value) %>% arrange(nutrientNumber) print(nutrients_df)
方案2:用Playwright模拟浏览器加载动态内容
如果不想使用API,可以通过playwright包模拟浏览器完整加载页面,获取渲染后的HTML:
library(playwright) library(rvest) library(tidyverse) # 初始化Playwright(首次运行会自动安装浏览器) playwright_install() pw <- playwright$launch() browser <- pw$chromium$launch(headless = TRUE) # 设置为FALSE可查看浏览器窗口 page <- browser$new_page() # 访问目标页面并等待营养表加载完成 url <- "https://fdc.nal.usda.gov/fdc-app.html#/food-details/2237774/nutrients" page$goto(url) page$wait_for_selector("#nutrients-table") # 抓取渲染后的HTML并提取表格 html <- page$content() nutrients_table <- read_html(html) %>% html_element("#nutrients-table") %>% html_table(header = TRUE) print(nutrients_table) # 关闭浏览器资源 browser$close() pw$stop()
内容的提问来源于stack exchange,提问作者Daiil Jun
相关产品推荐
相关产品推荐

