【问题标题】:Turning ElementTree findall() into a list将 ElementTree findall() 变成一个列表
【发布时间】:2012-11-07 17:24:47
【问题描述】:

我正在使用 ElementTree findall() 在我的 XML 中查找具有特定标记的元素。我想把结果变成一个列表。目前,我正在遍历元素,为每个元素挑选 .text 并附加到列表中。我确信有一种更优雅的方式来做到这一点。

#!/usr/bin/python2.7
#
from xml.etree import ElementTree
import os
myXML = '''<root>
<project project_name="my_big_project">
<event name="my_first_event">
<location>London</location>
<location>Dublin</location>
<location>New York</location>
<month>January</month>
<year>2013</year>
</event>
</project>
</root>
'''

tree = ElementTree.fromstring(myXML)
for node in tree.findall('.//project'):
  for element in node.findall('event'):
    event_name=element.attrib.get('name')
    print event_name
    locations = []
    if element.find('location') is not None:
      for events in element.findall('location'):
        locations.append(events.text)
# Could I use something like this instead?
#      locations.append(''.join.text(*events) for events in element.findall('location'))

print locations

输出这个(这是正确的,但我想将 findall() 结果直接分配给一个列表,如果可能的话,以文本格式;

my_first_event
['London', 'Dublin', 'New York']

【问题讨论】:

    标签: python list elementtree


    【解决方案1】:

    你可以试试这个 - 它使用list comprehension 来生成列表,而不必创建一个空白然后追加。

    if element.find('location') is not None:
      locations = [events.text for events in element.findall('location')]
    

    这样,您还可以摆脱上面的locations 定义,因此您的代码将是:

    tree = ElementTree.fromstring(myXML)
    for node in tree.findall('.//project'):
      for element in node.findall('event'):
        event_name=element.attrib.get('name')
        print event_name
        if element.find('location') is not None:
          locations = [events.text for events in element.findall('location')]
    
    print locations
    

    您需要警惕的一件事是您对位置所做的事情 - 如果 location 不存在,则不会定义它,因此如果您尝试打印它,您将得到一个 NameError 并它不存在。如果这是一个问题,您可以保留 locations = [] 定义 - 如果找不到匹配的元素,结果将只是一个空列表。

    【讨论】:

    • @jhonan 没问题,希望对您有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多