Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我怎样才能比我现在做的更清楚地从列表中获取特定类型的唯一元素?_Python_Lxml - Fatal编程技术网

Python 我怎样才能比我现在做的更清楚地从列表中获取特定类型的唯一元素?

Python 我怎样才能比我现在做的更清楚地从列表中获取特定类型的唯一元素?,python,lxml,Python,Lxml,我正在处理一些xml文件。文件的模式指定某一类型的元素只能有一个(在本例中,我使用的是footnotes元素) footnotes元素中可能有几个footnote元素,我正在尝试获取并处理footnotes元素,这样我就可以遍历它来发现footnote元素 这是我目前的做法 def get_footnotes(element_list): footnoteDict=od() footnotes_element=[item for item in element_list if

我正在处理一些xml文件。文件的模式指定某一类型的元素只能有一个(在本例中,我使用的是footnotes元素)

footnotes元素中可能有几个footnote元素,我正在尝试获取并处理footnotes元素,这样我就可以遍历它来发现footnote元素

这是我目前的做法

def get_footnotes(element_list):
    footnoteDict=od()

    footnotes_element=[item for item in element_list if item.tag=='footnotes'][0]
    for eachFootnote in footnotes_element.iter():
        if eachFootnote.tag=='footnote':
            footnoteDict[eachFootnote.values()[0]]=eachFootnote.text
    return footnoteDict
element_list是在遍历整个树之后与我相关的元素列表

因此,我想知道是否有一种更像python的方法来获取footnotes元素,而不是遍历元素列表。在我看来,这是一种笨拙的方法

footnotes_element=[item for item in element_list if item.tag=='footnotes'][0]

像这样的东西应该可以完成这项工作:

from lxml import etree

xmltree = etree.fromstring(your_xml)

for footnote in xmltree.iterfind("//footnotes/footnote"):
   # do something
   pass
如果您提供一些示例XML,就更容易提供帮助

编辑:

如果您正在处理非常大的文件,您可能需要查看
iterparse


这个问题似乎有一个很好的例子:

您应该看看这个问题及其答案()。也许您应该使用XPath和lxml。@erkysun谢谢您的帮助您建议我传递完整的树,而不是从树中获取相关元素。这是一个有趣的建议,我需要考虑一下。我首先运行一个函数,将我关心的元素的父元素拉入元素列表,并将该列表传递给我的其他函数。你的建议是我把这棵树拿过来传给别人。我的想法是,我正在使用的一些树非常大,因此通过在函数中删除我想要的元素,我可以通过垃圾收集除去其他不需要的东西。如果你正在使用非常大的文件,你应该查看
iterparse
。它允许您在解析文件时提取数据,而不是首先解析整个文件并将其保存在内存中。@PyNEwbie,您不会传递“整棵树”,只传递对它的引用。