【问题标题】:Parse id from XBRL file with BeautifulSoup使用 BeautifulSoup 从 XBRL 文件中解析 id
【发布时间】:2021-12-01 15:43:03
【问题描述】:

我在使用 Beautifulsoup 抓取 XBRL 文件时遇到问题。

代码:

openxbrl = open(file.file_path, 'r')
readxbrl = openxbrl.read()    
contextsoup = xbrlsoup.findAll('xbrli:context')
print(contextsoup)

给出以下输出(示例,有多个孩子)

  <xbrli:context id="context0">
     <xbrli:period>
      <xbrli:instant>
       2020-12-31
      </xbrli:instant>
     </xbrli:period>

我似乎无法弄清楚如何在不打印整个 contextsoup 的情况下解析上下文 ID:id="context0"。我尝试通过解析名称来打印 id:

 for child in contextsoup:
    pprint.pprint(child.name)
    pprint.pprint(child.find('xbrli:period'))

但不给我id

  'xbrli:context'
    <xbrli:period>
     <xbrli:instant>
      2020-12-31
     </xbrli:instant>
    </xbrli:period>

如何在不打印整个 xbrl 的情况下解析 id?

【问题讨论】:

  • 什么是complete name
  • id 不是name 的一部分,但它是attribute,您可以通过child['id']child.get('id') 获得它
  • child['id'] 有效!谢谢弗拉斯。不知道id是一个属性。

标签: python beautifulsoup xbrl


【解决方案1】:

id="context0" 不是元素名称的一部分,它是一个属性 (BS docs on attributes)

您可以通过将标签视为字典来访问属性值:

for context in contextsoup:
    print(context['id'])

您也可以直接按属性值查找标签。 id 属性的值在整个文档中应该是唯一的,所以你可以这样做:

soup.find(id='context0')

您还应该知道您正在使用命名空间 XML;如果您使用不同的 XBRL 报告,则不能依赖始终称为 xbrli:context 的上下文标记,因为 xbrli 位是文档定义的前缀,它为命名空间 URI 提供简写。我相信 Beautiful Soup 4 确实有一些命名空间支持,但我没有使用它。

正确解析 XML 格式的 XBRL 非常复杂,我建议使用现有的 XBRL 处理器来完成。处理 XBRL 报告的最佳方法之一是将其转换为较新的 xBRL-JSON format,然后将其作为 JSON 数据处理。有许多工具可以进行这种转换,包括开源的Arelle 项目。

【讨论】:

  • soup.find(id=True) 获取所有带有id 的元素也很有用
  • 我非常同意最后一段的说法。 BS 并不是真正适合 xbrl 的工具。
  • 感谢您的解释和将其转换为 xBRL-JSON 格式的建议,我会研究一下。 @Jack 您认为解析 xbrl 的更好工具是什么?
  • @Bob 我希望我有一个简单的答案 - xbrl 仍然是一团糟。我经常使用XBRL USthe tools they provide,发现它们很有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-02-04
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多