问题描述
我有一个可能非常愚蠢的问题,但我被它难住了,希望得到任何帮助。
我正在尝试使用 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_WriteoffOfFinancingCosts
中 ID 为 phil-20200630.xsd
的概念。
<element id="PHIL_WriteoffOfFinancingCosts"
name="WriteoffOfFinancingCosts" .../>
并且你可以看到这个概念的本地名称是WriteoffOfFinancingCosts
。它位于通常与前缀 PHIL:
关联的命名空间中,但从未出现在概念定义中,因为该文件中的所有概念都位于通常与 PHIL:
关联的命名空间中。现在,我们如何知道这一点?因为在 xsd 文件的顶部,它说 targetNamespace="http://phiglobal.com/20200630"
并且前缀 PHIL:
也附加到实例文件 phil-20200630.xml
中的这个命名空间,带有 xmlns:PHIL="http://phiglobal.com/20200630"
通常的做法是选择带有前缀、下划线和本地名称的概念 ID。一些用户依赖它,但遵循间接级别,尽管更复杂,但更“安全”:链接库标签 loc_PHILWriteoffOfFinancingCosts
-> 概念 ID PHIL_WriteoffOfFinancingCosts
-> 概念本地名称 {{1} } -> 概念的完全限定名称 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”的格式。我没有发现任何不遵循该格式的内容,但这不能保证。