代码之家  ›  专栏  ›  技术社区  ›  Charon

用ElementTree解析Python中XML的节点值

  •  2
  • Charon  · 技术社区  · 10 年前

    我从网页中解析了以下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 回复  |  直到 10 年前
        1
  •  2
  •   Corley Brigman    10 年前

    尝试更改

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

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

    findall 返回一个 列表 匹配的所有节点。因此,第一行返回所有 part_list 节点。你的 <part_list> 节点没有带有标记的子节点 part_type ,所以它会返回 None ,然后你得到了你的错误。

    如果您有一个节点 部件列表 然后 find 将返回实际节点,您可以使用 for part in 语法来遍历其所有子节点。

    如果您有多个 部件列表 标记,那么您只需要一个嵌套的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