使用ElementTree解析Python中XML的节点值

时间:2014-03-13 12:36:37

标签: python xml elementtree

我有以下从网页解析的XML:

<!--
Parts from the iGEM Registry of Standard Biological Parts
-->
<rsbpml>
 <part_list>
  <part>
   <part_id>151</part_id>
   <part_name>BBa_B0034</part_name>
   <part_short_name>B0034</part_short_name>
   <part_short_desc>RBS (Elowitz 1999) -- defines RBS efficiency</part_short_desc>
   <part_type>RBS</part_type>
   <release_status>Released HQ 2013</release_status>
   <sample_status>In stock</sample_status>

我想提取一些值。

例如,我想从RBS输出值<part_type>

我尝试过以下方法:

bb_xml_raw = urllib2.urlopen("http://parts.igem.org/cgi/xml/part.cgi?part=BBa_B0034")
self.parse = ET.parse(bb_xml_raw)
self.root = self.parse.getroot()

for part in self.root.findall('part_list'):
   print part.find('part_type').text

但它没有用,我得到:AttributeError:'NoneType' object has no attribute 'text'

我做错了什么?

1 个答案:

答案 0 :(得分:2)

尝试更改

for part in self.root.findall('part_list'):

for part in self.root.find('part_list'):

findall返回匹配的所有节点的列表。因此,第一行返回所有part_list个节点的列表。您的<part_list>节点没有标记为part_type的任何子节点,因此返回None,您就会收到错误。

如果您有一个节点part_list,那么find将返回实际节点,您可以使用正常的for part in语法来遍历其所有子节点。

如果你有多个part_list标签,那么你只需要一个嵌套的for循环:

for part_list in self.root.findall('part_list'):
    for part in part_list: 
         etc.

编辑:鉴于这是一个XY问题 - 如果您正在寻找的是一个特定的子路径,您可以一次完成所有这些,如下所示:

all_parts = self.root.findall('part_list/part')
print all_parts[0].find('part_type').tag

等。