【问题标题】:Parsing Node Value of XML in Python with ElementTree使用 ElementTree 在 Python 中解析 XML 的节点值
【发布时间】:2014-03-13 12:36:36
【问题描述】:

我有以下从网页解析的 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>

我想提取一些值。

例如,我想从&lt;part_type&gt; 中输出值RBS

我尝试了以下方法:

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'

我做错了什么?

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    尝试改变

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

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

    findall 返回所有匹配节点的列表。因此,第一行返回所有part_list 节点的列表。您的&lt;part_list&gt; 节点没有任何带有标签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
    

    等等。

    【讨论】:

    • 行得通,谢谢。此外,它还可以作为列表组合工作以使其更快: print [part.find('part_type').text for part in self.root.find('part_list')][0]
    • 如果这就是你想要做的......给我一分钟,看看我编辑的答案。
    猜你喜欢
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多