josw123 / dart-fss

한국 금융감독원에서 운영하는 다트(Dart) 시스템 크롤링을 위한 라이브러리
https://github.com/josw123/dart-fss
MIT License
319 stars 111 forks source link

maximum recursion depth exceeded in comparision 오류 발생합니다. #163

Closed ISeeTheFuture closed 4 months ago

ISeeTheFuture commented 4 months ago

케이스 정보

회사명 : HDC corp_code : 00164636 공시rcp : 20231114002460 공시 링크 : https://opendart.fss.or.kr/xbrl/viewer/main.do?rcpNo=20231114002460 dart_fss 버전 : 0.4.8 OS : 윈도우10

위 케이스로 get_financial_statement(), get_cash_flows(), get_income_statement()를 하면 "maximum recursion depth exceeded in comparision" 오류 발생합니다.

call stack은 다음과 같습니다. --------------------------------------------------------------------------- RecursionError Traceback (most recent call last) Cell In[48], [line 28](vscode-notebook-cell:?execution_count=48&line=28) [25](vscode-notebook-cell:?execution_count=48&line=25) cf = list_cf[0] [27](vscode-notebook-cell:?execution_count=48&line=27) # 연결 현금흐름표 DataFrame 형태로 출력 ---> [28](vscode-notebook-cell:?execution_count=48&line=28) df = cf.to_DataFrame() [30](vscode-notebook-cell:?execution_count=48&line=30) df `File [c:\projects\DU-DataProcessing\dev\.venv\lib\site-packages\dart_fss\xbrl\table.py:201](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:201), in Table.to_DataFrame(self, cls, lang, start_dt, end_dt, label, show_abstract, show_class, show_depth, show_concept, separator, ignore_subclass)` ` [198](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:198) cls = cls_merge_type(cls)` ` [200](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:200) depth = -1` `--> [201](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:201) for label in self.labels:` ` [202](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:202) depth = max(depth, get_max_depth(label, show_abstract=show_abstract))` ` [203](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:203) depth = depth if depth < show_depth else show_depth` File [c:\projects\DU-DataProcessing\dev\.venv\lib\site-packages\dart_fss\xbrl\table.py:158](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:158), in Table.labels(self) [156](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:156) relationship_set = self._xbrl.relationshipSet(arcrole, self.uri) [157](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:157) for root_concept in relationship_set.rootConcepts: --> [158](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:158) labels = get_label_list(relationship_set, root_concept) [159](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:159) self._labels.append(labels) [160](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/table.py:160) return self._labels `File [c:\projects\DU-DataProcessing\dev\.venv\lib\site-packages\dart_fss\xbrl\helper.py:42](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:42), in get_label_list(relationship_set, concepts, relationship)` ` [40](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:40) for rel in new_relationship_set:` ` [41](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:41) new_concepts = rel.viewConcept` `---> [42](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:42) res['children'].append(get_label_list(relationship_set, new_concepts, relationship=rel))` ` [43](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:43) return res` File [c:\projects\DU-DataProcessing\dev\.venv\lib\site-packages\dart_fss\xbrl\helper.py:42](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:42), in get_label_list(relationship_set, concepts, relationship) [40](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:40) for rel in new_relationship_set: [41](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:41) new_concepts = rel.viewConcept ---> [42](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:42) res['children'].append(get_label_list(relationship_set, new_concepts, relationship=rel)) [43](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:43) return res ` [... skipping similar frames: get_label_list at line 42 (2960 times)]` File [c:\projects\DU-DataProcessing\dev\.venv\lib\site-packages\dart_fss\xbrl\helper.py:42](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:42), in get_label_list(relationship_set, concepts, relationship) [40](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:40) for rel in new_relationship_set: [41](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:41) new_concepts = rel.viewConcept ---> [42](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:42) res['children'].append(get_label_list(relationship_set, new_concepts, relationship=rel)) [43](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:43) return res `File [c:\projects\DU-DataProcessing\dev\.venv\lib\site-packages\dart_fss\xbrl\helper.py:24](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:24), in get_label_list(relationship_set, concepts, relationship)` ` [20](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:20) else:` ` [21](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:21) preferred = relationship.preferredLabel` ` [23](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:23) label_ko = concepts.label(lang='ko') if preferred is None \` `---> [24](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:24) else concepts.label(preferredLabel=preferred, lang='ko')` ` [25](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:25) label_en = concepts.label(lang='en') if preferred is None \` ` [26](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:26) else concepts.label(preferredLabel=preferred, lang='en')` ` [28](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:28) res = {` ` [29](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:29) 'concept_id': concepts.id,` ` [30](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:30) 'order': 1.0 if relationship is None else relationship.order,` ` (...)` ` [34](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:34) 'children': []` ` [35](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/dart_fss/xbrl/helper.py:35) }` File [c:\projects\DU-DataProcessing\dev\.venv\lib\site-packages\arelle\ModelDtsObject.py:635](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelDtsObject.py:635), in ModelConcept.label(self, preferredLabel, fallbackToQname, lang, strip, linkrole, linkroleHint) [633](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelDtsObject.py:633) if labelsRelationshipSet: [634](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelDtsObject.py:634) for _lang in (lang if isinstance(lang, (tuple,list)) else (lang,)): --> [635](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelDtsObject.py:635) label = labelsRelationshipSet.label(self, preferredLabel, _lang, linkroleHint=linkroleHint) [636](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelDtsObject.py:636) if label is not None: [637](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelDtsObject.py:637) if strip: return label.strip() `File [c:\projects\DU-DataProcessing\dev\.venv\lib\site-packages\arelle\ModelRelationshipSet.py:372](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelRelationshipSet.py:372), in ModelRelationshipSet.label(self, modelFrom, role, lang, returnMultiple, returnText, linkroleHint)` ` [370](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelRelationshipSet.py:370) if labelLang:` ` [371](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelRelationshipSet.py:371) labelLang = labelLang.lower() # must be case insensitive for processiing` `--> [372](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelRelationshipSet.py:372) text = label.textValue if returnText else label` ` [373](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelRelationshipSet.py:373) if _lang is None or len(_lang) == 0 or _lang == labelLang:` ` [374](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelRelationshipSet.py:374) langLabels.append(text)` File [c:\projects\DU-DataProcessing\dev\.venv\lib\site-packages\arelle\ModelObject.py:276](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelObject.py:276), in ModelObject.textValue(self) [274](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelObject.py:274) @property [275](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelObject.py:275) def textValue(self) -> str: # xml axis text() differs from string value, no descendant element text --> [276](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelObject.py:276) return ''.join(self._textNodes()) `File [c:\projects\DU-DataProcessing\dev\.venv\lib\site-packages\arelle\ModelObject.py:281](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelObject.py:281), in ModelObject._textNodes(self, recurse)` ` [279](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelObject.py:279) if self.text and getattr(self,"xValid", 0) != VALID_NO_CONTENT: # skip tuple whitespaces` ` [280](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelObject.py:280) yield self.text` `--> [281](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelObject.py:281) for c in self.iterchildren():` ` [282](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelObject.py:282) if recurse and isinstance(c, ModelObject):` ` [283](file:///C:/projects/DU-DataProcessing/dev/.venv/lib/site-packages/arelle/ModelObject.py:283) for nestedText in c._textNodes(recurse):` File src\\lxml\\etree.pyx:1461, in lxml.etree._Element.iterchildren() `File src\\lxml\\etree.pyx:2866, in lxml.etree.ElementChildIterator.__cinit__()` File src\\lxml\\etree.pyx:2837, in lxml.etree._ElementMatchIterator._initTagMatcher() `File src\\lxml\\etree.pyx:2704, in lxml.etree._MultiTagMatcher.__cinit__()` File src\\lxml\\etree.pyx:2734, in lxml.etree._MultiTagMatcher.initTagMatch() ` RecursionError: maximum recursion depth exceeded in comparison`

josw123 commented 4 months ago

안녕하세요.

올려주신 버그는 확인하였습니다. XBRL 파일 쪽에 문제가 있는 것으로 생각됩니다만 추가적인 확인이 필요합니다. 일단 RecursionError가 발생하지 않도록 수정하여 다음 버전에 배포하도록 하겠습니다.