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

如何在R中抓取含跨多行列的复杂系谱表(pedigree chart)?

解决系谱表HTML抓取与结构转换问题

步骤1:放弃自动表格解析,手动提取单元格内容

常规的html_table()会因为HTML里混乱的colspan/rowspan属性导致解析结果重复、结构混乱,所以直接提取所有<td>元素的文本并清理:

library(rvest)
library(stringr)
library(dplyr)

# 替换为目标页面的URL或本地HTML路径
page <- read_html("你的目标页面地址")

# 提取所有表格单元格文本,清理冗余空格与空内容
cells <- page %>% 
  html_nodes("#PedigreeTable td") %>% 
  html_text() %>% 
  str_squish() %>% 
  filter(. != "")

步骤2:分析系谱表的层级映射规律

从你描述的结构来看,这个系谱表是层级化布局:顶层个体(如Betty)在最上方,其父母(Jack、Sue)分布在后续行的对应位置,再往下是祖父母、曾祖父母层级,每个层级的个体数量是上一层的2倍。

根据你提供的内容,核心关系为:

  • Betty → 父亲Jack、母亲Sue
  • Jack → 父亲Bo、母亲Bob
  • Sue → 父亲Owen、母亲Jacob
  • Jim → 父亲Luca、母亲Blane
  • 附带个体:Dan(b 1932)、Ava(b 1947)

步骤3:构建规范的亲属关系DataFrame

手动映射(适合小型系谱)

如果系谱规模不大,直接按关系手动构建:

pedigree_df <- tibble(
  person = c("Betty", "Jack", "Sue", "Bo", "Bob", "Owen", "Jacob", "Jim", "Dan", "Ava"),
  father = c("Jack", "Bo", "Owen", NA, NA, NA, NA, "Luca", NA, NA),
  mother = c("Sue", "Bob", "Jacob", NA, NA, NA, NA, "Blane", NA, NA),
  birth_year = c(NA, NA, 1940, NA, NA, NA, NA, NA, 1932, 1947)
)

自动匹配逻辑(适合大型系谱)

如果系谱是标准层级布局,可通过索引自动关联亲属关系:

# 按层级划分单元格(根据实际结构调整索引范围)
levels <- list(
  level1 = cells[1],          # 顶层个体:Betty
  level2 = cells[2:3],        # 父母层:Jack、Sue
  level3 = cells[4:7],        # 祖父母层:Bo、Bob、Owen、Jacob
  level4 = cells[8:11],       # 曾祖父母层:Jim、Dan、Luca、Blane
  others = cells[12]          # 其他个体:Ava
)

# 逐层构建亲属关系
pedigree_df <- bind_rows(
  # 顶层个体与父母
  tibble(
    person = levels$level1,
    father = levels$level2[1],
    mother = levels$level2[2]
  ),
  # 父母与祖父母
  tibble(
    person = levels$level2,
    father = levels$level3[c(1,3)],
    mother = levels$level3[c(2,4)]
  ),
  # 祖父母与曾祖父母(根据实际数据调整匹配逻辑)
  tibble(
    person = levels$level3,
    father = levels$level4[c(1,2,3,4)],
    mother = NA
  ),
  # 剩余个体
  tibble(
    person = c(levels$level4, levels$others),
    father = NA,
    mother = NA
  )
) %>% 
  # 分离出生年份与姓名
  mutate(
    birth_year = str_extract(person, "\\d{4}"),
    person = str_remove(person, " b \\d{4}")
  )

步骤4:验证与调整

运行后检查DataFrame是否符合预期,若单元格顺序或层级关系与假设不符,仅需调整levels中的索引范围或匹配逻辑即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:13:59