2014-03-13 46 views
2

我有下面的XML這是我從網頁解析:XML解析節點值在用Python的ElementTree

<!-- 
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> 

而且我想提取一些值。

例如,我想從<part_type>輸出值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'

我在做什麼錯?

回答

2

嘗試改變

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

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

findall返回匹配的所有節點的列表。因此,第一行返回所有節點的列表。您的<part_list>節點沒有任何子標籤part_type,因此它返回None,並且您收到錯誤消息。

如果您有一個節點part_list,則find將返回實際節點,您可以使用正常的for part in語法來遍歷其所有子節點。

如果您有多個part_list標籤,那麼你只需要一個嵌套的循環:

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 

+0

這工作,謝謝。此外,它作爲一個列表補充,以使其更快:print [part.find('part_type')。self.root.find('part_list')] [0]中的部分文本 – Charon

+1

如果這就是你想要的做...給我一分鐘,看看我編輯的答案。 –