是否存在R函数可从HTML字符串列中提取特定变量值?
从HTML字符串列提取特定字段到数据框新列
问题场景
现有数据框包含name和bio列,其中bio是带HTML标签的长字符串,需要从中提取<status>和<profession>标签内的内容,生成对应的新列。
现有数据:
name <- c("John", "Max") bio <- c("<status>1</status><profession>Revisor</professio>", "<status>1</status><born>19.06.1995</born><profession>Tech</professio>" ) df <- data.frame(name, bio)
期望得到包含name、status、profession列的数据框。
方法一:使用正则表达式(适合简单HTML结构)
借助stringr包的字符串处理函数快速提取内容,注意匹配示例中不完整的结束标签</professio>:
library(stringr) # 提取status并转换为整数 df$status <- str_extract(df$bio, "<status>(.*?)</status>") %>% str_remove_all("<status>|</status>") %>% as.integer() # 提取profession df$profession <- str_extract(df$bio, "<profession>(.*?)</professio>") %>% str_remove_all("<profession>|</professio>") # 保留需要的列 df <- df[, c("name", "status", "profession")]
方法二:使用xml2包(规范HTML解析)
对于复杂HTML结构,用专业的HTML解析包更可靠,先补全示例中不完整的标签再解析:
library(xml2) # 定义通用提取函数 extract_tag <- function(html_str, tag) { # 补全示例中不完整的结束标签 fixed_html <- gsub("</professio>", "</profession>", html_str) # 包裹根标签确保解析正常 doc <- read_html(paste0("<root>", fixed_html, "</root>")) # 提取目标标签的文本内容 xml_text(xml_find_first(doc, paste0("//", tag))) } # 批量提取字段 df$status <- as.integer(sapply(df$bio, extract_tag, tag = "status")) df$profession <- sapply(df$bio, extract_tag, tag = "profession") # 整理列 df <- df[, c("name", "status", "profession")]
两种方法最终都能得到期望的数据框结构。
内容的提问来源于stack exchange,提问作者malthemidjord
相关产品推荐
相关产品推荐

