EDINET(金融庁の開示情報システム)からダウンロードしたXBRLファイルは、企業の財務情報を標準化された形式で提供しています。しかし、XBRLファイルの構造は非常に複雑であり、どの要素にどの情報が含まれているのかを理解するのは容易ではありません。そこで今回は、Pythonを使用してEDINETからダウンロードしたXBRLファイルを読み込み、そのファイルに含まれる要素を抽出する方法について解説します。
コードの全体像
今回のコードは以下の3つのステップで構成されています。
- EDINETからダウンロードしたZIPファイルからXBRLファイルを抽出する。
- XBRLファイルをパースし、XML形式で読み込む。
- XBRLファイル内のユニークな要素を再帰的に抽出して表示する。
必要なライブラリ
- lxml: XMLおよびHTMLを効率的に処理するためのライブラリです。XBRLはXML形式で記述されているため、このライブラリが必要です。
- zipfile: ZIP形式の圧縮ファイルを扱うための標準ライブラリです。EDINETからダウンロードされるファイルはZIP形式になっているため、これを解凍するために使用します。
コードの解説
- ZIPファイルからXBRLファイルを抽出する
import zipfile
def extract_xbrl(zip_file_path):
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
# .xbrlファイルを取得
xbrl_files = [f for f in zip_ref.namelist() if f.endswith('.xbrl')]
if xbrl_files:
return zip_ref.read(xbrl_files[0]) # 最初のXBRLファイルを返す
return None
この部分では、まずEDINETからダウンロードしたZIPファイルのパスを指定し、そのZIPファイル内に含まれるXBRLファイルを抽出しています。zipfile.ZipFile
を使ってZIPファイルを開き、その中から拡張子が.xbrl
で終わるファイルを検索しています。
xbrl_files[0]
で最初に見つかったXBRLファイルを読み込み、その内容をバイト列として返します。このバイト列を後ほどXMLとしてパースします。
2. XBRLファイルをパースし、XMLとして読み込む
from lxml import etree
# ZIPファイルのパスを指定して実行
xbrl_content = extract_xbrl('edinet_data/S100TL6G.zip')
# 文字列からXMLをパース
root = etree.fromstring(xbrl_content)
次に、extract_xbrl
関数で抽出したXBRLファイルの内容を、lxml.etree.fromstring()
を使ってXMLツリーとしてパースします。これで、XBRLファイルがXML形式として扱えるようになります。
3. XBRLファイル内のユニークな要素を再帰的に抽出
# 要素名を保持するためのセット
unique_elements = set()
def print_structure(element, level=0):
# タグ名、名前空間を除いたタグ名を取得
ns_tag = etree.QName(element).localname
# すでに表示した要素名はスキップ
if ns_tag not in unique_elements:
unique_elements.add(ns_tag) # 新しい要素名をセットに追加
indent = " " * level # 階層に応じたインデントを追加
print(f"{indent}Tag: {ns_tag}")
# 子要素を再帰的に表示
for child in element:
print_structure(child, level + 1)
# ルート要素から構造を表示
print_structure(root)
ここでは、XMLの構造を再帰的に辿りながら、各要素の名前(タグ名)を抽出して表示しています。
ポイント:
- 再帰的な処理:
print_structure
関数は、各要素が持つ子要素を辿り、再帰的にその要素のタグ名を表示します。 - ユニークな要素名の抽出: 同じタグ名が複数回表示されないように、
unique_elements
というセットを使ってすでに表示したタグ名を管理しています。これにより、XBRLファイルに含まれるユニークなタグだけが表示されます。 - 階層表示: 各要素の階層に応じてインデントを付けることで、XMLの構造がわかりやすく表示されます。
実行結果
このコードを実行すると、以下のようにXBRLファイル内の要素名が階層構造を反映して表示されます。
Tag: xbrl
Tag: schemaRef
Tag: roleRef
Tag: context
Tag: entity
Tag: identifier
Tag: period
Tag: instant
Tag: scenario
Tag: explicitMember
Tag: startDate
Tag: endDate
Tag: unit
Tag: measure
Tag: divide
Tag: unitNumerator
Tag: unitDenominator
Tag: NumberOfSubmissionDEI
Tag: RevenueIFRSSummaryOfBusinessResults
Tag: GrossProfitIFRSSummaryOfBusinessResults
Tag: ProfitLossAttributableToOwnersOfParentIFRSSummaryOfBusinessResults
Tag: ComprehensiveIncomeAttributableToOwnersOfParentIFRSSummaryOfBusinessResults
Tag: EquityAttributableToOwnersOfParentIFRSSummaryOfBusinessResults
Tag: TotalAssetsIFRSSummaryOfBusinessResults
この結果から、XBRLファイルがどのような構造を持っているのかがわかります。
結論
今回のコードは、EDINETからダウンロードしたXBRLファイルの要素を抽出するための基本的な方法を示しています。XBRLファイルの中身は非常に複雑で、多くのタグが含まれていますが、このコードを使えば、それらを効率的に解析し、必要なデータを取り出すことができます。
次回の記事では、これらの要素を基に、特定の財務データを抽出する方法について解説します。
関連リンク