如何用R的rvest包关联网页h2标题与对应h3分组及物种表格?
解决h2大分类与下属h3分组及表格的关联问题
核心思路是利用网页的DOM结构:每个h2大标题对应的下属内容(h3分组、表格)都位于当前h2节点之后,直到下一个h2节点之前的区间。通过遍历每个h2节点,截取其后续到下一个h2前的内容,再提取其中的h3和对应表格,即可建立层级关联。
实现代码
# 加载依赖包 library(rvest) library(dplyr) library(purrr) # 获取网页内容 url <- "https://www.quebec.ca/agriculture-environnement-et-ressources-naturelles/faune/gestion-faune-habitats-fauniques/especes-fauniques-menacees-vulnerables/liste" page <- read_html(url) # 提取所有h2节点并逐个处理 h2_nodes <- page %>% html_elements("h2") result_list <- map(h2_nodes, function(h2_node) { # 提取当前h2的标题 h2_title <- h2_node %>% html_text(trim = TRUE) # 获取h2之后的所有兄弟节点 sibling_nodes <- h2_node %>% html_next_siblings() # 找到下一个h2的位置,截断兄弟节点(仅保留当前h2下属内容) next_h2_index <- which(sibling_nodes %>% html_name() == "h2") if (length(next_h2_index) > 0) { sibling_nodes <- sibling_nodes[1:(next_h2_index - 1)] } # 在当前h2下属节点中提取所有h3分组 h3_nodes <- sibling_nodes %>% html_elements("h3") # 遍历每个h3,绑定其对应的表格 h3_table_data <- map(h3_nodes, function(h3_node) { h3_title <- h3_node %>% html_text(trim = TRUE) # 获取h3紧跟的第一个表格 table_node <- h3_node %>% html_next_sibling("table") if (!is.na(table_node)) { # 表格转数据框并添加层级标题 table_df <- table_node %>% html_table(header = TRUE, trim = TRUE) table_df %>% mutate( `大分类(h2)` = h2_title, `分组(h3)` = h3_title, .before = 1 ) } else { NULL # 无对应表格时返回空值 } }) # 合并当前h2下的所有表格数据 bind_rows(h3_table_data) }) # 合并所有层级的最终数据框 final_species_df <- bind_rows(result_list)
关键逻辑说明
- 区间截断:通过
html_next_siblings()获取h2后的所有兄弟节点,再通过判断下一个h2的位置截断,确保只处理当前h2的下属内容,避免跨分类混淆。 - 精准关联表格:用
html_next_sibling("table")直接定位h3节点紧跟的表格,保证每个h3分组对应正确的物种表格。 - 层级绑定:通过
mutate在表格数据中添加h2和h3的标题列,实现大分类-分组-物种表格的完整关联。
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

