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

使用rvest爬取网页时html_nodes返回空列表的问题求助

问题根源

该网站的博客内容是通过JavaScript动态渲染加载的,read_html()只能获取服务器返回的初始静态HTML,这段静态代码里并没有包含实际的博客文章内容(包括你要找的"Border patrol arrests..."段落),所以调用html_nodes(webpage, "p")会返回空列表。

解决办法

不需要用复杂的RSelenium,这里有两个更易上手的方案:

方案1:用V8解析页面中的JS数据

网站把博客数据存在页面的JS变量里,用V8包可以直接解析这段数据:

  1. 先安装所需包:
install.packages(c("rvest", "V8"))
  1. 运行以下代码:
library(rvest)
library(V8)

url <- "https://www.cato.org/blog"
# 获取初始页面
webpage <- read_html(url)
# 提取存储博客数据的JS脚本
js_data <- html_text(html_nodes(webpage, "script#__NEXT_DATA__"))

# 初始化V8环境并解析JS数据
ctx <- v8()
ctx$eval(paste0("var postData = ", js_data))
parsed_data <- ctx$get("postData")

# 提取博客列表
posts <- parsed_data$props$pageProps$posts

# 筛选开头匹配目标文本的文章
target_post <- posts[sapply(posts, function(x) startsWith(x$excerpt, "Border patrol arrests..."))][[1]]

# 获取目标段落文本
result_text <- target_post$excerpt
print(result_text)

方案2:直接调用网站的API接口

该网站提供了公开的JSON接口返回博客数据,直接请求接口更高效:

  1. 安装依赖包(如果没装的话):
install.packages(c("httr", "jsonlite"))
  1. 执行代码:
library(httr)
library(jsonlite)

# 请求博客数据API
api_response <- GET("https://www.cato.org/sites/cato.org/files/blog-posts.json")
blog_posts <- fromJSON(content(api_response, "text"))

# 筛选目标文章
target_post <- blog_posts[sapply(blog_posts, function(x) startsWith(x$excerpt, "Border patrol arrests..."))][[1]]

# 提取目标文本
result_text <- target_post$excerpt
print(result_text)

内容的提问来源于stack exchange,提问作者Ophelia Hanson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:11:50