使用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
相关产品推荐
相关产品推荐

