下面给出的XML
<country >
<name>London</name>
<rank>1</rank>
<gdppc>141100</gdppc>
</country>
当我使用None
方法查找'year'标签时,我需要函数返回find
。
def get_age_by_name(rank):
data = [a for a in root.findall('.//country') if a.find('rank').text == rank]
year = data.find('year').tag
return None
输出显示:
year = data.find('year').tag
AttributeError: 'list' object has no attribute 'find'
我确认'year'标记不在XML文件中。我只需要函数在XML文件中找不到“ year”时返回None
。
您的代码失败也就不足为奇了。 数据是列表节点,因此您可以应用ElementTree方法,例如上此列表的每个element,而不是整个列表本身。
您的代码失败的另一个细节是:
如果要在XML树中查找country
对于我的示例,我使用以下XML(作为字符串变量txt
):<main> <country id="11"> <name>London</name> <rank>1</rank> <gdppc>141100</gdppc> </country> <country id="12"> <name>Paris</name> <rank>2</rank> <gdppc>222200</gdppc> <year>1980</year> </country> </main>
为了解析它,我跑了:
root = et.fromstring(txt)
然后定义您的功能,如下所示:
def get_age_by_name(rank): for node in [ a for a in root.findall('.//country') if a.find('rank').text == rank ]: for child in node: if child.tag == 'year': return child.text return None
详细信息:
运行时:
print(get_age_by_name('1')) print(get_age_by_name('2'))
结果是:
值,您同时具有“负”和“正”结果。None 1980
因此,对于不同的[[rank