2

lxml を使用して処理しているタグ付きデータがいくつかあります。ファイルを開くとき、ファイルを開く前に、3 つのタイプの要素のうち 1 つ以上があるかどうかわかりません (1 つ、2 つ、または 3 つの異なる要素と、任意のタイプの複数のインスタンスを持つことができます)

要素の子タグに含まれるこれらの要素に関する情報が必要です

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

したがって、この場合、3 つのタイプすべてがありますが、各タイプは 1 つだけですが、任意のタイプの任意の数まで存在する可能性があります。

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

これは冗長すぎるようです

これを少しきれいにする何かが欠けていますか?

参考までに、タイプごとに関連ドキュメントの他のデータと一致させる必要があるため、これを行っています

初期の回答は、少し明確にする必要があることを示唆しています-ツリーを3回実行するのを避けたいです

4

4 に答える 4

5

あなたはこれを行うことができます:

for i in range(1, 4):
    type_dict['type_%d' % i] = myTree.cssselect('element_type_%d' % i)
于 2012-07-29T21:16:27.707 に答える
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
于 2012-07-29T21:16:21.863 に答える
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]"
于 2012-09-27T22:00:21.893 に答える
0

または、一連の既知のタグを繰り返し処理して、一致する要素を探すこともできます。要素が見つかったら、dict に (tag, value) を追加します。問題なく動作するはずです。

于 2012-07-29T21:42:13.453 に答える