R用rvest爬取时将<p>XML节点集转换为dataframe的实现方法
实现方案
该需求完全可以实现,核心思路是将每个<div.accordion-inner>下的<p>文本拆分为「字段名-字段值」键值对,转为单行数据框后合并即可。
依赖包准备
提前加载所需依赖:
library(rvest) library(stringr) library(plyr) library(dplyr)
核心处理函数
编写单个代理人节点的解析函数,将节点转为单行数据框:
# 输入单个accordion-inner节点,输出对应单行数据框 parse_agent <- function(agent_node) { # 提取所有p标签文本,清除多余空格、换行符,过滤空内容 p_texts <- agent_node %>% html_nodes("p") %>% html_text() %>% str_squish() %>% .[. != ""] # 拆分每个文本为键值对,仅拆分第一个冒号避免字段值内的冒号干扰 key_value_list <- lapply(p_texts, function(text) { parts <- str_split(text, ":\\s*", n = 2)[[1]] if(length(parts) != 2) return(NULL) # 跳过不符合键值格式的内容 setNames(parts[2], parts[1]) }) %>% unlist() # 转为单行数据框 as.data.frame(t(key_value_list), stringsAsFactors = FALSE) }
完整执行流程
# 原有页面获取逻辑 agents_url <- "https://nbpa.com/agents/directory" agents_page <- read_html(agents_url) agents_page_elements <- html_nodes(agents_page, 'div.accordion-inner') # 批量解析所有代理人节点 agent_df_list <- lapply(agents_page_elements, parse_agent) # 合并所有单行数据框,缺失字段自动填充NA final_agent_df <- rbind.fill(agent_df_list)
可选优化
可对列名做标准化处理,方便后续数据操作:
# 列名统一转小写、空格替换为下划线 colnames(final_agent_df) <- colnames(final_agent_df) %>% str_to_lower() %>% str_replace_all("\\s+", "_")
如果需要保留不符合键值格式的特殊内容,可调整拆分逻辑,将异常内容统一存入自定义的other_info列即可。
内容的提问来源于stack exchange,提问作者Canovice
相关产品推荐
相关产品推荐

