我有以下从网页解析的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'
我做错了什么?
答案 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
等。