2012-07-29 70 views
2

我有些標記,我使用lxml的處理數據選擇多個元素類型。當我打開一個文件,我不知道該文件被打開之前,如果我有一個或一個以上三種類型的元素的(我能有什麼類型我有一個,兩個或三個不同的元素和多個實例)更Python的方式從標記數據

我需要了解的是被包含在這種情況下,我有三個類型,但僅在每個類型的一個元素

<element_type_1> 
     <name>joe smith</name> 
</element_type_1> 
<element_type_2> 
     <name>mary smith</name> 
</element_type_2> 
<element_type_3> 
     <name>patrick smith</name> 
</element_type_3> 

那麼的子標籤,這些元素的一些信息。然而,可能有多達一些隨意性較大數量的任何類型的。

我在我的功能

def get_types(myTree): 
    type_dict=defaultdict(list) 
    type_dict['type_1']=myTree.cssselect('element_type_1') 
    type_dict['type_2']=myTree.cssselect('element_type_2') 
    type_dict['type_3']=myTree.cssselect('element_type_3') 
    ret type_dict 

這似乎過於冗餘

我失去的東西,會收拾這個有點用cssselect 3次獲得的元素?

僅供參考,我這樣做是因爲每種類型的我不得不從相關文件

早期的答案,建議我要澄清一點符合其他一些數據 - 我想避免通過樹三次

運行
+0

你有使用csselect?否則,帶有'contains('element_type _')'的XPath表達式可能會更好地實現這個技巧? (見http://stackoverflow.com/questions/11106971/how-to-search-for-content-in-xpath-in-multiline-text-using-python) – Qiau 2012-07-29 21:23:56

回答

5

你可以這樣做:

for i in range(1, 4): 
    type_dict['type_%d' % i] = myTree.cssselect('element_type_%d' % i) 
1

取決於如果你知道它的外觀。使用變量作爲關鍵字可能是一件簡單的事情,可以幫助您改進一點。

def get_types(myTree): 
    type_dict=defaultdict(list) 
    for i in range(1,4): 
     x = 'type_%d' % i 
     y = 'element_type_%d' % i 
     type_dict[x] = myTree.csselect(y) 
    return type_dict 
0

或者你可以遍歷一組已知的標籤查找匹配的元素。當你找到一個元素時,添加(標籤,值)到字典。應該可以工作。

1

我完全不知道你是如何識別這些「類型」,如果你不事先知道他們的名字。他們是否遵循一些可以搜索的固定模式?

例如,你可以這樣做:

d = {} 
typeelements = "*[starts-with(local-name(), 'element_type_')]" 
for e in myTree.xpath(typeelements) 
    typename = e.tag.split('_',1)[1] 
    d[typename] = e 

或者更簡潔地說:

d = {e.tag.split('_',1)[1]:e for e in myTree.xpath(typeelements)} 

或者,您也可以選擇基於元素本身的一些標準的元素。 IUN你的榜樣,他們都name孩子,所以你可以使用這樣的路徑:

typeelements = '*[name]' 

,也可混合兩種要求:

typeelements = "*[starts-with(name(), 'element_type_')][name]"