实例文档和计算文档之间的 XBRL 标签名称不同

XBRL label names differ between instance and calculation documents

我有一个问题,可能是一个非常愚蠢的问题,但我被它难住了,希望得到任何帮助。 我正在尝试使用 Python 和 BeautifulSoup 从 SEC 文件中收集 xbrl 数据。我遇到的一个问题是某些行项目在实例文档和计算链接库中的引用不同。 作为一个具体的例子,以 PHI Group Inc. 最近的 10-K 为例: https://www.sec.gov/Archives/edgar/data/704172/000149315221015100/0001493152-21-015100-index.htm 带有 xbrl 标记“WriteoffOfFinancingCosts”的订单项显示为 <PHIL:WriteoffOfFinancingCosts ...> 在实例文档中(连同值和上下文) 但在计算链接库中显示为“loc_PHILWriteoffOfFinancingCosts”。 但是这种关系,'PHIL:' = 'loc_PHIL',在 XBRL 文件中并不是标准的。如何知道计算链接库中的标签将添加什么前缀,以便(删除前缀后)它可以可靠地绑定回实例文档中的标签? 我可以想到各种解决方法,但这看起来很愚蠢;是不是有什么地方我可以查看计算链接库或其他地方,它们只会告诉我添加了什么前缀? 作为一些(可能相关的)细微差别:很多文件中的很多标签,当然,有一个像 'us-gaap' 这样的前缀,表示 us-gaap 命名空间,但这似乎并不能保证计算中的标签因此,链接库看起来像“us-gaapAccountsPayableCurrent”,而不是“loc_us-gaapAccountsPayableCurrent”或“us-gaap:AccountsPayableCurrent”或基本模式的其他变体,当然,所有这些看起来都不同于 BeautifulSoup。 谁能指出我正确的方向?

PHIL:WriteoffOfFinancingCosts是XBRL概念的名称,而loc_PHILWriteoffOfFinancingCosts是指向概念PHIL:WriteoffOfFinancingCosts的定位器的(计算链接库)标签。这种机制是链接库将概念连接在一起的方式:每个定位器都是一个概念的“代理”。

loc_PHILWriteoffOfFinancingCosts 因此是计算链接库的内部细节。链接库标签的名称原则上是“自由选择”的,但是有自己建立的约定(例如前缀为 loc_),但我不会依赖它们。相反,您可以通过查看链接库标签的定义来“追踪”:

<link:loc xlink:type="locator"
          xlink:href="phil-20200630.xsd#PHIL_WriteoffOfFinancingCosts"
          xlink:label="loc_PHILWriteoffOfFinancingCosts" />

由于 xlink:href 属性,您可以看到该定位器指向文件 phil-20200630.xsd.

中 ID 为 PHIL_WriteoffOfFinancingCosts 的概念
<element id="PHIL_WriteoffOfFinancingCosts"
         name="WriteoffOfFinancingCosts" .../>

并且可以看到这个概念的本地名称是WriteoffOfFinancingCosts。它位于通常与前缀 PHIL: 关联的命名空间中,但从未出现在概念定义中,因为该文件中的所有概念都位于通常与 PHIL: 关联的命名空间中。现在,我们怎么知道的?因为在 xsd 文件的顶部,它说 targetNamespace="http://phiglobal.com/20200630" 并且前缀 PHIL: 也附加到实例文件 phil-20200630.xmlxmlns:PHIL="http://phiglobal.com/20200630"[ 中的这个命名空间=31=]

通常的做法是选择带有前缀、下划线和本地名称的概念 ID。一些用户依赖它,但是遵循间接级别,尽管更复杂,但更“安全”:链接库标签 loc_PHILWriteoffOfFinancingCosts -> 概念 ID PHIL_WriteoffOfFinancingCosts -> 概念本地名称 WriteoffOfFinancingCosts -> 概念的完全限定名称 PHIL:WriteoffOfFinancingCosts.

您可能注意到这有多么复杂。事实上,这就是为什么值得使用 XBRL 处理器的原因,它会为您完成所有这些工作。

@Ghislain Fourny:非常感谢。我很高兴知道我并没有因为发现情况复杂而发疯。现在知道链接库标签是“自由选择”的,这里是我想出的具体 BeautifulSoup 解决方法,以防有人感兴趣:

labeldict = {}
resp = requests.get(calcurl, headers = headers)
ctext = resp.text
soup = BeautifulSoup(ctext, 'lxml')
tags = soup.find_all()
for tag in tags:
    if tag.name == 'link:loc':
        if tag.has_attr('xlink:href') and tag.has_attr('xlink:label'):
            href = tag['xlink:href']
            firstsplit = href.split('#')[1] ## gets the part of the link after the pound symbol
            value = firstsplit.split('_')[1] ## gets the part after the underscore
            key = tag['xlink:label']
            labeldict[key] = value

这会生成一个字典,其中键是 'loc_Phil' 类型的标签名称,值是普通概念名称,例如labeldict['loc_PHILWriteoffOfFinancingCosts'] = 'WriteoffOfFinancingCosts' 这假定 xsd 链接将始终遵循“...#..._concept”的格式。我还没有发现任何不遵循该格式的内容,但这并不能保证。