使用rvest爬取网页时html_nodes返回空列表的问题求助
问题根源
该网站的博客内容是通过JavaScript动态渲染加载的,read_html()只能获取服务器返回的初始静态HTML,这段静态代码里并没有包含实际的博客文章内容(包括你要找的"Border patrol arrests..."段落),所以调用html_nodes(webpage, "p")会返回空列表。
解决办法
不需要用复杂的RSelenium,这里有两个更易上手的方案:
方案1:用V8解析页面中的JS数据
网站把博客数据存在页面的JS变量里,用V8包可以直接解析这段数据:
- 先安装所需包:
install.packages(c("rvest", "V8"))
- 运行以下代码:
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接口返回博客数据,直接请求接口更高效:
- 安装依赖包(如果没装的话):
install.packages(c("httr", "jsonlite"))
- 执行代码:
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
相关产品推荐
相关产品推荐

