簡體   English   中英

從標記數據中選擇多種元素類型的更多pythonic方法

[英]More pythonic way to pick multiple element types from tagged data

我有一些使用lxml處理的標記數據。 當我打開文件時,我不知道在打開文件之前是否具有三種類型的元素中的一種或多種(我可以具有一種,兩種或三種不同的元素以及我擁有的任何類型的多個實例)

我需要一些有關這些元素的信息,這些信息包含在元素的子標記中

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

因此,在這種情況下,我擁有所有三種類型,但是每種類型只有一種,但是任何類型都可以有任意多個任意數量的數字。

我通過在函數中使用cssselect 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

這似乎過於多余

我是否缺少可以解決此問題的內容?

僅供參考,我這樣做是因為對於每種類型,我都必須匹配相關文檔中的其他一些數據

早期的答案表明我需要澄清一下-我想避免穿過樹三遍

您可以這樣做:

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

取決於您是否了解外觀。 使用變量作為鍵可能會很容易,可以幫助您進行一點點的改進。

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

如果您事先不知道它們的名稱,我將不知道如何識別這些“類型”。 它們遵循您可以搜索的固定模式嗎?

例如,您可以執行以下操作:

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)}

或者,您可以根據元素本身中的某些條件選擇元素。 在您的示例中,它們都具有子name ,因此您可以使用以下路徑:

typeelements = '*[name]'

或者,您可以結合兩個要求:

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

或者,您可以遍歷一組已知標簽以尋找匹配的元素。 找到元素后,將(tag,value)添加到dict。 應該工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM