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

如何在R语言中将HTML列表转换为树形层级结构?

解决方案:将HTML层级列表转换为R的data.tree树形结构

结合你提到的data.tree包的路径转换思路,我推荐用rvest来更便捷地解析HTML(比XML包更友好),通过递归遍历提取每个节点的完整层级路径,再转成树形结构。以下是具体步骤和代码:

1. 安装并加载必要的包

首先确保安装了所需的工具包:

install.packages(c("rvest", "data.tree", "dplyr"))

加载包:

library(rvest)
library(data.tree)
library(dplyr)

2. 解析HTML并提取层级路径

我们先抓取目标页面,然后通过递归函数遍历所有li节点,收集每个节点的文本、链接以及完整的父级路径:

# 读取目标页面内容
url <- "https://biocyc.org/META/class-subs-instances?object=Pathways"
page <- read_html(url)

# 提取顶级节点信息(对应示例中的"Activation/Inactivation/Interconversion")
top_node_text <- page %>% html_element("b > a") %>% html_text2()
top_node_link <- page %>% html_element("b > a") %>% html_attr("href")

# 获取顶级节点下的第一个ul(包含所有子层级)
top_ul <- page %>% html_element("b + ul")
top_lis <- top_ul %>% html_elements("li")

# 递归函数:遍历单个li节点,收集自身及所有子节点的路径信息
extract_tree_nodes <- function(li_node, parent_path = "") {
  # 提取当前节点的文本和链接
  current_text <- li_node %>% html_element("a") %>% html_text2()
  current_link <- li_node %>% html_element("a") %>% html_attr("href")
  
  # 构建当前节点的完整路径
  current_path <- if (parent_path == "") {
    current_text
  } else {
    paste(parent_path, current_text, sep = "/")
  }
  
  # 存储当前节点数据
  node_data <- tibble(
    path = current_path,
    text = current_text,
    link = current_link
  )
  
  # 检查当前节点是否有子ul
  child_ul <- li_node %>% html_element("ul")
  if (!is.na(child_ul)) {
    # 遍历子ul下的所有li节点
    child_lis <- child_ul %>% html_elements("li")
    for (child in child_lis) {
      node_data <- bind_rows(node_data, extract_tree_nodes(child, current_path))
    }
  }
  
  return(node_data)
}

# 初始化树形数据,加入顶级节点
tree_data <- tibble(
  path = top_node_text,
  text = top_node_text,
  link = top_node_link
)

# 遍历所有顶级li节点,收集子节点数据
for (li in top_lis) {
  tree_data <- bind_rows(tree_data, extract_tree_nodes(li, top_node_text))
}

3. 转换为data.tree树形对象

现在我们有了带完整路径的数据集,直接用data.tree的FromDataFramePath函数就能生成树形结构:

# 从路径数据构建树形结构
pathway_tree <- FromDataFramePath(tree_data, pathName = "path")

# 打印树形结构(限制显示前20个节点,避免输出过多)
print(pathway_tree, limit = 20)

# 用你提到的ToDataFrameTypeCol导出层级化数据,验证结构
tree_df <- ToDataFrameTypeCol(pathway_tree, "text", "link")
head(tree_df, 10)

关键说明

  • 选择器调整:如果页面结构有变动,可能需要修改html_element的选择器,比如用更精确的CSS选择器定位目标列表(比如通过父元素的class/id)。
  • 空链接处理:如果某些节点没有链接,html_attr("href")会返回NA,你可以根据需求添加逻辑处理(比如替换为空字符串)。
  • 扩展属性:如果需要提取更多节点属性(比如节点的加粗标记),可以在递归函数里添加对应的提取逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:40:03