我从Companies House下载了一个包含约200,000个html文件的zip文件。
每个文件采用以下两种格式之一:1)内联XBRL格式(.html文件扩展名)或2)XBRL格式(.xml文件扩展名)。查看最新的下载文件(6 December 2018),所有文件似乎都是以前的格式(.html文件扩展名)。
我正在R中使用XBRL package来尝试解析这些文件。
问题1:XBRL软件包用于解析内联XBRL格式(.html)文件,还是仅适用于XBRL(.xml)格式?如果没有,谁能告诉我在哪里分析内联XBRL格式文件?我不完全确定内联和非内联之间有什么区别。
假设XBRL软件包旨在解析内联XBRL格式文件,我遇到一个错误,告诉我xbrl.frc.org.uk/FRS-102/2014-09-01/FRS-102 -2014-09-01.xsd文件不存在。这是我的代码:
install.packages("XBRL")
library(XBRL)
inst <- "./rawdata/Prod224_0060_00000295_20171130.html" # manually unzipped
options(stringsAsFactors = FALSE)
xbrl.vars <- xbrlDoAll(inst, cache.dir = "XBRLcache", prefix.out = NULL, verbose = TRUE)
和错误:
Schema: ./rawdata/https://xbrl.frc.org.uk/FRS-102/2014-09-01/FRS-102-2014-09-01.xsd
Level: 1 ==> ./rawdata/https://xbrl.frc.org.uk/FRS-102/2014-09-01/FRS-102-2014-09-01.xsd
Error in XBRL::xbrlParse(file) :
./rawdata/https://xbrl.frc.org.uk/FRS-102/2014-09-01/FRS-102-2014-09-01.xsd does not exists. Aborting.
问题2.有人可以从基本的角度解释这对我意味着什么吗?我是XBRL的新手。我需要去找到这个xsd文件并将其放在某个地方吗? It seems to be located here,但我不知道该怎么做或放在哪里。
Here's a similar question that doesn't seem fully answered和所有链接都是西班牙语的,我不知道西班牙语。
一旦我能够解析单个html XBRL文件,我的计划就是弄清楚如何解析该网站上多个zip文件中的所有XBRL文件。
答案 0 :(得分:1)
如 pdw 所述,问题在于该包被硬编码以查找“http:”并且错误地将“https”路径视为本地路径。发生这种情况是因为 XBRL 文件可以引用外部文件以获取模式的标准定义等。在您的示例中,这发生在 Prod224_0081_00005017_20191231.html 的第 116 行
有几个人在 github 上 fork 了 XBRL 包并修复了这个问题。您可以使用 devtools::install_git()
安装来自 https://github.com/cran/XBRL/network/members 的版本之一,这应该可以解决。
例如,使用此 fork 解析示例 Companies House 语句。
# remotes:::install_github("adamp83/XBRL")
library(XBRL)
x <- xbrlDoAll("https://raw.githubusercontent.com/stackoverQs/stackxbrlQ/main/Prod224_0081_00005017_20191231.html",cache.dir = "cache" verbose=TRUE))
答案 1 :(得分:0)
我对您所使用的XBRL软件包不熟悉,但是很明显,它试图将绝对URL(https://..。)解析为本地文件是错误的。
快速浏览源代码可以发现问题所在:
XBRL.R第305行:
fixFileName <- function(dname, file.name) {
if (substr(file.name, 1, 5) != "http:") {
[...]
即它通过是否以“ http:”开头来确定URL是否是绝对的,而您的URL以“ https:”开头。破解一个漏洞很容易,也允许https URL也通过此测试,我怀疑这将解决您的直接问题,尽管如果此代码使用URL库来确定URL是绝对的还是更好的话,那会更好。而不是根据协议进行猜测。
我不确定iXBRL文档的状态是什么。变更日志中有一条注释,内容为“据报告可与内联XBRL文档一起使用”,我对此表示怀疑。虽然它可以正确找到内联文档的分类法,但我看不到它如何用大量我看不见的附加代码正确地提取事实。
您可能想看看Arelle项目,它是肯定支持Inline XBRL的替代开源处理器。
答案 2 :(得分:0)
这里有一些更一般的解释,以提供一些背景信息。
简单地说,XBRL文件只是事实的简单列表。
内联XBRL是XBRL实例的更新版本,它不是将这些事实存储为平面列表,而是将这些事实存储在人类可读的文档中,以“标记”值。从抽象的XBRL处理角度来看,XBRL文件和内联XBRL文件都是XBRL实例,并且都是事实集。
XBRL实例(内联或非内联)还链接到XBRL用户称为DTS(可发现分类法集)的一些或大量分类法文件。这些文件是包含报告元素(概念,尺寸等)的XML Schema文件(.xsd)或包含链接库(报告元素的图形,标签等)的XML链接文件(.xml)。
将XBRL实例链接到DTS的机制有点复杂和异构:模式导入,模式包含,指向其他文件的简单链接等。作为用户,足以理解DTS由所有文件组成通过这些链接对实例进行传递关闭。 XBRL处理器(包括R包)的工作是解决整个DTS。
通常,XBRL实例指向位于分类提供者的服务器上的文件(称为入口点),并且该文件本身可能指向同一服务器和其他服务器上的其他文件。
但是,按照惯例,许多XBRL处理器会自动在本地缓存这些文件,以避免服务器超载。通常,您不需要自己执行此操作。自行解决链接以手动下载所有文件非常麻烦。
另一种方法是从分类供应商的服务器下载整个DTS(遵循打包标准的zip文件)并在本地使用。但是,这还需要XBRL处理器找出远程URL和本地文件之间的映射。
答案 3 :(得分:0)
我对美国SEC数据有完全相同的问题。
而且我恰好遵循了pdw的指导,它确实起作用了!
仅供参考,我用于
if (substr(file.name, 1, 5) != "http:") {
是
if (!(substr(file.name, 1, 5) %in% c("http:", "https"))) {
然后我用trace('XBRL', edit=TRUE)
对其进行了入侵。