我正在使用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']

最佳答案

您可以尝试-使用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 = []定义-如果找不到匹配的元素,则结果将只是一个空列表。

关于python - 将ElementTree findall()转换为列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13459741/

10-12 04:11
查看更多