You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:09:32