【问题标题】:Is there a more pythonic way to access the child elements of parents using lxml是否有更 Pythonic 的方式来使用 lxml 访问父母的子元素
【发布时间】:2010-06-24 01:21:30
【问题描述】:

我正在研究 XBRL 文档,试图弄清楚如何有效地提取和使用数据。我一直在努力解决的一件事是确保我正确使用上下文信息。下面是我正在玩的一个文件中的一个 sn-p(这是来自美泰最新的 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 语句

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

【问题讨论】:

    标签: python lxml xbrl


    【解决方案1】:

    使用元素树接口(lxml 也支持),getiterator 迭代子树中以当前元素为根的所有节点。

    所以,[list(c.getiterator()) for c in contextlist] 为您提供了您想要的列表列表(或者您可能希望将 c 保留在结果列表中,以避免以后必须使用 contextlist 对其进行压缩,即直接制作一个元组列表 [(c, list(c.getiterator())) for c in contextlist] ,具体取决于您的预期用途)。

    顺便提一下,[x for x in whatever] 的精确形式的 listcomp 没有多大意义 - 使用 list(whatever) 将任何其他可迭代对象转换为列表。

    【讨论】:

    • 再次感谢亚历克斯,也许我可以得到你的直接电话?干杯
    • @PyNewbie,哦,你可能已经注意到,我对 SO 非常活跃;-)
    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多