如何提取网页爬取CSV单元格内字段并拆分为独立数据列
众筹CSV嵌套creator字段提取方案
适用场景
爬取得到的众筹网站CSV数据包含ID、Pledge、creator三个字段,其中creator列为类JSON格式的嵌套字符串,混杂用户主页URL、创作者姓名、创作者ID三类信息,需要单独提取name、id字段生成独立列。
R语言实现(优先推荐)
依赖jsonlite做JSON解析,兼容空值、格式错误等脏数据场景:
- 先安装缺失依赖(已经装过可以跳过)
install.packages(c("dplyr", "jsonlite", "purrr")) - 完整解析代码
library(dplyr) library(jsonlite) # 替换为你的本地CSV路径 df <- read.csv("your_crowdfunding_file.csv", stringsAsFactors = FALSE) # 单条记录解析函数,自动兼容异常格式 parse_creator_col <- function(x) { if (is.na(x) || nchar(trimws(x)) == 0) { return(data.frame(creator_name = NA_character_, creator_id = NA_character_)) } tryCatch({ parsed_json <- fromJSON(x) data.frame( creator_name = ifelse(is.null(parsed_json$name), NA_character_, as.character(parsed_json$name)), creator_id = ifelse(is.null(parsed_json$id), NA_character_, as.character(parsed_json$id)) ) }, error = function(e) { data.frame(creator_name = NA_character_, creator_id = NA_character_) }) } # 批量解析并合并到原数据集 df <- df %>% bind_cols(purrr::map_dfr(df$creator, parse_creator_col))
如果不想加载purrr包,可以把最后一步替换为基础R实现:
parsed_res <- do.call(rbind, lapply(df$creator, parse_creator_col)) df <- cbind(df, parsed_res)
Python实现方案
用pandas+内置json库即可实现,逻辑和R版本一致:
import pandas as pd import json # 替换为你的本地CSV路径 df = pd.read_csv("your_crowdfunding_file.csv") def parse_creator_col(x): if pd.isna(x) or str(x).strip() == "": return pd.Series([None, None]) try: parsed = json.loads(x) return pd.Series([parsed.get("name"), parsed.get("id")]) except: return pd.Series([None, None]) df[["creator_name", "creator_id"]] = df["creator"].apply(parse_creator_col)
Stata实现方案
Stata原生JSON解析能力较弱,针对该固定格式的字段用正则提取即可,注意极端脏数据场景下兼容度不如前两种方案:
* 替换为你的本地CSV路径 import delimited "your_crowdfunding_file.csv", clear * 提取创作者姓名字段 gen creator_name = ustrregexs(1) if ustrregexm(creator, `"name["\s:]+([^,"}]+)"') * 提取创作者ID字段 gen creator_id = ustrregexs(1) if ustrregexm(creator, `"id["\s:]+([0-9a-zA-Z]+)"')
提示:如果数据中creator列格式错乱的记录占比高,建议先用R或Python完成字段解析,再导出为CSV导入Stata做后续统计分析,避免正则漏匹配。
内容的提问来源于stack exchange,提问作者Juno Oh
相关产品推荐
相关产品推荐

