使用 python 解析 XBRL
Parsing XBRL using python
我正在处理来自 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>
此代码returns零,而我想要-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, ect)
,第二列是来自 XML
文件的值。
我不明白为什么相同的代码块不起作用。在这两种情况下,我似乎都在做同样的事情。查找值并存储它。
一个区别是 if 语句在第一种情况下检查 gaap_obj.COST_GOOD_SOLD,而在第二种情况下只检查 NET_CURR_DEBT。
如果不了解 self.data_processing 的实际作用,很难进一步发表评论,但是您的代码是否处理了同一元素可能在 XBRL 文档中多次出现(因不同上下文而异)这一事实?
正如我对您之前的问题 () 的评论,我不建议 beautifulsoup 解析 XBRL,因为它的命名空间支持不完整。使用合适的 XBRL 库会更好,它还可以为您处理上下文等。
python-xbrl 中有许多遗漏和误导性的存根方法和参数,这些方法和参数什么都不做。如果不通读代码,我不会相信它。
这里有一个例子——一个名为 parse_unique() 的方法对 XML 执行 运行 某种过滤器,但随后忽略它:
@classmethod
def parse_unique(self, xbrl):
"""
Parse company unique entities from XBRL and return an Unique object.
"""
unique_obj = Unique()
unique_data = xbrl.find_all(re.compile('^(?!us-gaap|xbrl*):\s*'))
return unique_obj
然后是Unique的定义:
class Unique(object):
def __init__(self):
return None
我不会直接通过这些评论解决您的问题,但建议您仔细查看代码以确保它按照您的预期运行。
我正在处理来自 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>
此代码returns零,而我想要-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, ect)
,第二列是来自 XML
文件的值。
我不明白为什么相同的代码块不起作用。在这两种情况下,我似乎都在做同样的事情。查找值并存储它。
一个区别是 if 语句在第一种情况下检查 gaap_obj.COST_GOOD_SOLD,而在第二种情况下只检查 NET_CURR_DEBT。
如果不了解 self.data_processing 的实际作用,很难进一步发表评论,但是您的代码是否处理了同一元素可能在 XBRL 文档中多次出现(因不同上下文而异)这一事实?
正如我对您之前的问题 (
python-xbrl 中有许多遗漏和误导性的存根方法和参数,这些方法和参数什么都不做。如果不通读代码,我不会相信它。
这里有一个例子——一个名为 parse_unique() 的方法对 XML 执行 运行 某种过滤器,但随后忽略它:
@classmethod
def parse_unique(self, xbrl):
"""
Parse company unique entities from XBRL and return an Unique object.
"""
unique_obj = Unique()
unique_data = xbrl.find_all(re.compile('^(?!us-gaap|xbrl*):\s*'))
return unique_obj
然后是Unique的定义:
class Unique(object):
def __init__(self):
return None
我不会直接通过这些评论解决您的问题,但建议您仔细查看代码以确保它按照您的预期运行。