1

我正在研究 XBRL 文档,试图弄清楚如何有效地提取和使用数据。我一直在努力解决的一件事是确保我正确使用上下文信息。下面是我正在使用的文档之一的片段(来自美泰最新的 10-K)

我希望能够有效地收集上下文键值对,因为它们对于帮助对齐“真实”数据很重要这是一个上下文元素的示例

- <context id="eol_PE6050----0910-K0010_STD_0_20091231_0">
  - <entity>
     <identifier scheme="http://www.sec.gov/CIK">0000063276</identifier> 
   </entity>
  - <period>
   <instant>2009-12-31</instant> 
   </period>
   </context>

当我开始这个时,我认为如果存在父子关系,我应该能够直接通过将方法(?)应用于父级来获取所有子级的属性、键、值和文本。但是,尽管可以从父母那里找到孩子,但孩子仍然保持独立。我的意思是,如果子项具有属性、键、值和/或文本,则无法从父项直接访问这些构造,而是您必须确定/识别子项,并从子项访问所需的数据或元数据。

我不完全确定为什么这段代码是一个很好的起点:

 from lxml import etree
 test_tree=etree.parse(r'c:\temp\test_xml\mat-20091231.xml')
 tree_list=[p for p in test_tree.getiterator() 

所以我的 tree_list 是确定存在于我的 xml 文件中的元素的列表
因为我的 tree_list 中只有 664 个项目,所以我做了一个非常糟糕的假设,即父级中的所有元素都包含在父级中,所以我一直在尝试通过仅引用这些元素(而不是它们的子元素)来访问实体、周期和瞬间

for each in tree_list:
    if 'context' in each.tag:
        contextlist.append(each)

那就是我一直对上下文列表中的项目应用不同的方法并且非常沮丧。最后,当我写出问题时,我试图获得一些帮助,以确定哪种方法可以为我提供我刚决定尝试的实体和时期

children=[c for c in contextlist[0].iterchildren()]

所以我的孩子列表包含上下文列表中第一项的所有孩子

一个子元素是实体元素,另一个是周期元素

现在,应该是每个子元素都有一个子元素,实体元素有一个标识符子元素,而周期元素有一个即时子元素。这比今天早上看起来要复杂得多。

我必须知道上下文元素报告的细节才能正确评估和操作真实数据。似乎我必须测试上下文元素的每个子元素是否有更快更有效的方法来获取这些值?换个说法,有没有办法拥有一些元素并创建一个包含其所有子代和孙代等的数据结构,而无需执行大量的 try else 语句

一旦有了它们,我就可以开始构建数据字典并根据上下文将数据元素分配给特定条目。因此,有效且完整地获取上下文元素对我的任务至关重要。

4

1 回答 1

3

Using the element-tree interface (which lxml also supports), getiterator iterates over all the nodes in the subtree rooted at the current element.

So, [list(c.getiterator()) for c in contextlist] gives you the list of lists you want (or you may want to keep c in the resulting list to avoid having to zip it with contextlist later, i.e. diretly make a list of tuples [(c, list(c.getiterator())) for c in contextlist], depending on your intended use).

Note in passing that a listcomp of the exact form [x for x in whatever] never makes much sense -- use list(whatever), instead, to turn whatever other iterable into a list.

于 2010-06-24T05:02:53.610 回答