如何用R提取SEC XML中nonDerivativeTable节点转为DataFrame
提取SEC Form4 XML中nonDerivativeTable数据为DataFrame的R实现
针对你遇到的问题,核心原因是SEC的Form4 XML带有命名空间,且字段多嵌套在子节点中,之前的通用示例未适配这种结构。以下是针对目标文件的具体实现步骤:
1. 安装并加载必要包
install.packages(c("xml2", "dplyr")) library(xml2) library(dplyr)
2. 设置合法请求头(SEC强制要求)
SEC服务器会拦截无标识的请求,必须提供包含联系方式的User-Agent:
user_agent <- "你的姓名 your.email@example.com" # 替换为你的真实信息
3. 读取并解析XML文件
xml_url <- "https://www.sec.gov/Archives/edgar/data/1274494/000112760222021374/form4.xml" xml_doc <- read_xml(xml_url, user_agent = user_agent)
4. 处理XML命名空间
目标XML自带命名空间,直接使用XPath会找不到节点,需先提取命名空间:
ns <- xml_ns(xml_doc) transactions <- xml_find_all(xml_doc, "//nonDerivativeTable/nonDerivativeTransaction", ns)
5. 提取数据并转换为DataFrame
定位到nonDerivativeTable下的所有交易节点,逐一提取嵌套字段:
# 遍历所有交易节点,提取核心字段 df <- purrr::map_dfr(transactions, function(node) { dplyr::tibble( 交易日期 = xml_find_first(node, "./transactionDate/value", ns) %>% xml_text(), 交易代码 = xml_find_first(node, "./transactionCode/value", ns) %>% xml_text(), 证券名称 = xml_find_first(node, "./securityTitle/value", ns) %>% xml_text(), 交易股数 = xml_find_first(node, "./transactionAmounts/transactionShares/value", ns) %>% xml_text() %>% as.numeric(), 每股交易价格 = xml_find_first(node, "./transactionAmounts/transactionPricePerShare/value", ns) %>% xml_text() %>% as.numeric(), 买卖标识 = xml_find_first(node, "./transactionAmounts/acquiredDisposedCode/value", ns) %>% xml_text(), 交易后持股数 = xml_find_first(node, "./postTransactionAmounts/sharesOwnedFollowingTransaction/value", ns) %>% xml_text() %>% as.numeric() ) }) # 查看结果 print(df)
关键说明
- 必须设置合法的User-Agent,否则会被SEC服务器拒绝访问
- 所有字段都嵌套在
value子节点中,需通过完整XPath路径定位 - 命名空间
ns必须传入xml_find_all/xml_find_first函数,否则无法匹配节点
内容的提问来源于stack exchange,提问作者Arturo
相关产品推荐
相关产品推荐

