如何使用rvest将层级网页数据抓取为表格格式?
解决层级数据抓取的长度不匹配问题
问题出在你分别抓取了所有部门和所有管理员,没有建立部门与对应管理员的关联。正确的做法是逐个处理每个部门的容器区块,在每个区块内同时提取部门名称和该部门下的所有管理员,这样就能保证两者的对应关系。
以下是修正后的代码:
library(rvest) library(dplyr) library(purrr) page <- read_html("https://postdocs.stanford.edu/about/department-postdoc-admins") # 遍历每个部门区块,同步提取部门和对应管理员 admin_data <- page %>% html_elements(".item-list") %>% map_dfr(function(block) { # 提取当前区块的部门名称 dept <- block %>% html_element("h3") %>% html_text2() # 提取当前区块下的所有管理员姓名 admins <- block %>% html_elements("li h4") %>% html_text2() # 处理无管理员的部门(保留部门行,管理员字段设为NA) if (length(admins) == 0) { tibble(department = dept, admin_name = NA_character_) } else { tibble(department = dept, admin_name = admins) } }) # 查看结果示例 head(admin_data)
代码逻辑说明
- 先抓取页面中所有
.item-list区块,每个区块对应一个部门的完整信息 - 使用
map_dfr遍历每个区块:- 在当前区块内提取部门名称
- 在当前区块内提取所有属于该部门的管理员姓名
- 将部门名称与管理员姓名配对,每个管理员对应一行相同的部门名称
map_dfr自动将所有区块的结果合并为一个整洁的tibble,最终数据行数等于管理员总数(含无管理员的部门行)
内容的提问来源于stack exchange,提问作者a.sa.5969
相关产品推荐
相关产品推荐

