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

如何用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)

关键逻辑说明

  1. 区间截断:通过html_next_siblings()获取h2后的所有兄弟节点,再通过判断下一个h2的位置截断,确保只处理当前h2的下属内容,避免跨分类混淆。
  2. 精准关联表格:用html_next_sibling("table")直接定位h3节点紧跟的表格,保证每个h3分组对应正确的物种表格。
  3. 层级绑定:通过mutate在表格数据中添加h2和h3的标题列,实现大分类-分组-物种表格的完整关联。

内容的提问来源于stack exchange,提问作者M. Beausoleil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:03:25