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

使用rvest包的html_nodes循环未保留全部数据的问题求助

解决循环中数据被覆盖的问题

你遇到的核心问题是每次循环都直接覆盖了dff变量——原来的代码里,每次循环都会执行dff <- data.frame(b),这相当于把dff重置为只包含当前国家数据的新数据框,之前循环得到的内容自然就丢失了,最后只剩最后一次循环的结果。

这里提供两种靠谱的解决思路,帮你保留所有国家的数据:

方法1:用列表收集结果(推荐,效率更高)

先初始化一个空列表,把每个国家的结果存入列表,最后再合并成一个完整的数据框。这种方式避免了循环中反复复制数据框,数据量大的时候效率更高:

library(rvest)
country <- c("Canada", "US", "Japan", "China")

# 初始化空列表用于存储每个国家的结果
result_list <- list()

for (i in seq_along(country)) {
  # 拼接目标URL
  url <- paste0("https://en.wikipedia.org/wiki/", country[i])
  # 读取页面
  page <- read_html(url)
  # 提取目标节点并转为字符
  b <- page %>% html_nodes('h2.flow-title') %>% html_nodes('a.page-link') %>% as.character()
  
  # 将当前国家的结果存入列表,同时记录国家名称(方便后续区分)
  result_list[[i]] <- data.frame(country = country[i], link_html = b, stringsAsFactors = FALSE)
}

# 把列表中的所有数据框合并成一个
dff <- do.call(rbind, result_list)

方法2:循环中追加数据(直观易懂)

如果你觉得列表的方式有点绕,也可以每次循环把当前国家的数据追加到dff里。注意要先初始化一个结构匹配的空数据框,再用rbind或者dplyr::bind_rows来追加:

library(rvest)
library(dplyr) # 需要加载dplyr包使用bind_rows
country <- c("Canada", "US", "Japan", "China")

# 初始化空数据框,列名要和后续临时数据框一致
dff <- data.frame(country = character(), link_html = character(), stringsAsFactors = FALSE)

for (i in country) {
  url <- paste0("https://en.wikipedia.org/wiki/", i)
  page <- read_html(url)
  b <- page %>% html_nodes('h2.flow-title') %>% html_nodes('a.page-link') %>% as.character()
  
  # 创建当前国家的临时数据框
  temp_df <- data.frame(country = i, link_html = b, stringsAsFactors = FALSE)
  # 追加到dff中
  dff <- bind_rows(dff, temp_df)
}

两种方法都能帮你保留所有国家的结果,而且我特意加上了country列,这样你能清楚知道每条节点数据属于哪个国家,后续分析也更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:54:37