python - 使用python解析XBRL

标签 python xbrl

我正在努力解析 xbrl 中的值。我的代码基于 python-xbrl 包,但对其进行了一些更改以满足我的需求。该包使用beautifulsoup4

我使用下面的代码来查找我感兴趣的一个值。我使用 if 语句,因为不同的公司对同一事物使用不同的标签名称。

例如,AAPL 使用 us-gaap:CostOfGoodsAndServicesSold,ADBE 使用 us-gaap:CostOfRevenue

这段代码按预期工作,给了我正确的值 29924000000

    #COST_GOOD_SOLD
    COST_GOOD_SOLD = xbrl.find_all(name=re.compile("(us-gaap:CostOfGoodsAndServicesSold$)",
                                                   re.IGNORECASE | re.MULTILINE))
    gaap_obj.COST_GOOD_SOLD = self.data_processing(COST_GOOD_SOLD, xbrl, ignore_errors,
                                                   logger, context_ids)
    if gaap_obj.COST_GOOD_SOLD ==0 or gaap_obj.COST_GOOD_SOLD==None:
        COST_GOOD_SOLD = xbrl.find_all(name=re.compile("(us-gaap:CostOfRevenue$)",
                                                           re.IGNORECASE | re.MULTILINE))
        gaap_obj.COST_GOOD_SOLD = self.data_processing(COST_GOOD_SOLD, xbrl, ignore_errors,
                                                       logger, context_ids)

XBRL

<us-gaap:CostOfGoodsAndServicesSold contextRef="eol_PE2035----1510-Q0008_STD_91_20150627_0" unitRef="iso4217_USD" decimals="-6" id="id_5025426_2D2AD7F5-3575-48A0-9F08-7F1EBE173C23_1_1">29924000000</us-gaap:CostOfGoodsAndServicesSold>

这段代码返回零,而我想要-1808000000

    #NET_CURR_DEBT
    NET_CURR_DEBT = xbrl.find_all(name = re.compile("(us-gaap:ProceedsFromRepaymentsOfCommercialPaper$)",
                                                    re.IGNORECASE | re.MULTILINE))
    gaap_obj.NET_CURR_DEBT = self.data_processing(NET_CURR_DEBT, xbrl, ignore_errors,
                                                  logger, context_ids)
    if NET_CURR_DEBT==0 or NET_CURR_DEBT==None:
        NET_CURR_DEBT = xbrl.find_all(name = re.compile("(us-gaap:RepaymentsOfLongTermDebtAndCapitalSecurities$)",
                                                        re.IGNORECASE | re.MULTILINE))
        gaap_obj.NET_CURR_DEBT = self.data_processing(NET_CURR_DEBT, xbrl, ignore_errors,
                                                      logger, context_ids)

XBRL

<us-gaap:ProceedsFromRepaymentsOfCommercialPaper contextRef="eol_PE2035----1510-Q0008_STD_273_20150627_0" unitRef="iso4217_USD" decimals="-6" id="id_5025426_049B4F11-216C-4D4B-A41F-32F1F55F967F_1_32">-1808000000</us-gaap:ProceedsFromRepaymentsOfCommercialPaper>

我还有几个正在解析的其他值,但它们都具有与我附加的代码相同的结构。 我的输出是一个数据框,其中第一列是值名称(COST_GOOD_SOLD、NET_CURR_DEBT等),第二列是来自XML文件的值。

我不明白为什么相同的代码块不起作用。看来我在这两种情况下都在做同样的事情。查找一个值并存储它。

最佳答案

一个区别是 if 语句在第一种情况下检查 gaap_obj.COST_GOOD_SOLD,但在第二种情况下仅检查 NET_CURR_DEBT。

在不了解 self.data_processing 实际执行的操作的情况下很难进一步评论,但是您的代码是否能够处理同一元素可能在 XBRL 文档中多次出现的事实(通过不同的上下文进行区分)?

正如我对您之前的问题 ( Reading xbrl with python ) 的评论,我不推荐 beautifulsoup 来解析 XBRL,因为它的命名空间支持不完整。您最好使用适当的 XBRL 库,它还会为您处理上下文等。

关于python - 使用python解析XBRL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33963598/

相关文章:

python-ldap -- 在 Active Directory 中创建用户 -- 问题 2003 (BAD_ATT_SYNTAX) cn 和 DN

java - XSLT 等同于 XBRL,允许像 XSLT 对 XML 那样对 XBRL 进行转换

python - 如何存储搜索结果以进行本地化

python - 如何将 .txt 文件的内容分配给 Python 中的字符串变量?

parsing - 如何选择 <dei :DocumentType from XBRL using Cheerio (or

java - 阅读 XBRL 事实 - Java

java - 从 xml 文件执行验证时出错

python - 如何限制Python 3中多线程程序中的API调用?

Python:通过将键的所有值组合成 1 行来解析 CSV 并存储新的数据帧