0

次のタイプと構造のデータを含むファイルがあります。

<data>
    <from>A</from>
    <to>B</to>
    <data>
        <name>EXAMPLE ONE</name>
        <info>
            <some_data>1</some_data>
            <more_data>2</more_data>
        </info>
        <random>
            <some_tag>
            </foobar>
            <foo>
                <bar />
           </foo>
        </random>
    </data>
    <data>
        <name>EXAMPLE TWO</name>
        <info>
            <some_data>3</some_data>
            <more_data>4</more_data>
        </info>
        <random>
            <some_tag>
            </foobar>
            <foo>
                <bar />
           </foo>
        </random>
   </data>
</data>
<data>
    <from>C</from>
    <to>D</to>
    <data>
        <name>EXAMPLE</name>
        <info>
            <some_data>1</some_data>
            <more_data>2</more_data>
        </info>
        <random>
            <some_tag>
            </foobar>
            <foo>
                <bar />
           </foo>
        </random>
    </data>
 </data>

データは、n 回繰り返すことができ、かつ n 回繰り返される最も内側の<data>...</data>タグを除いて、ファイル内のこの正確な構造に続きます。データ構造は常にタグで始まり、タグ<data>で続きます。<from>...</from><to>...</to>

私がやりたいことは、データ ブロックの説明としてとを<data>使用して、最も外側のタグの間のすべてのデータを抽出することです。もちろん、最も内側のタグを互いに分離し、このデータを保存して、最も外側のデータが親データに関連していることが明確になるようにしたいと考えています。<to><from><data>

どのようにデータを保存したいのか正確にはわかりませんので、例を挙げていただければ幸いです!

私はこれを Python モジュール BeautifulSoup でテストしており、ここで多くの例を検索して読んでいますが、正しい方向に向けることができるものは何も見つかりませんでした。

ありがとう!

4

1 に答える 1

0

<data>タグ名をレコードのコンテナーと内部の要素として二重にしているという事実は、問題を引き起こします。BeautifulSoupはそのような問題を許容しており、戻って XML 構造を変更できない場合に使用できる方法を次に示します。

データを変数に割り当てます。もちろん、これはテキストファイルから読み込むことができます:

data = '''<data>
    <from>A</from>
    <to>B</to>
    <data>
        <name>EXAMPLE ONE</name>
        <info>
            <some_data>1</some_data>
            <more_data>2</more_data>
        </info>
        <random>
            <some_tag>
            </foobar>
            <foo>
                <bar />
           </foo>
        </random>
    </data>
    <data>
        <name>EXAMPLE TWO</name>
        <info>
            <some_data>3</some_data>
            <more_data>4</more_data>
        </info>
        <random>
            <some_tag>
            </foobar>
            <foo>
                <bar />
           </foo>
        </random>
   </data>
</data>
<data>
    <from>C</from>
    <to>D</to>
    <data>
        <name>EXAMPLE</name>
        <info>
            <some_data>1</some_data>
            <more_data>2</more_data>
        </info>
        <random>
            <some_tag>
            </foobar>
            <foo>
                <bar />
           </foo>
        </random>
    </data>
 </data>'''

データを処理します。

from BeautifulSoup import BeautifulSoup
from pprint import pprint

store = {}
key = ()

soup = BeautifulSoup(data)

recs = soup.findAll('data')

for rec in recs:
    if rec.find('from'):
        key = (rec.find('from').text, 
               rec.find('to').text)
    else:
        item = {}
        item['name'] = rec.find('name').text
        item['some_data'] = rec.find('info').find('some_data').text
        item['more_data'] = rec.find('info').find('more_data').text
        if store.has_key(key):
            store[key].append(item)
        else:
            store[key] = [ item ]

pprint(store)

そして、このダミーデータの結果:

{(u'A', u'B'): [{'more_data': u'2',
                 'name': u'EXAMPLE ONE',
                 'some_data': u'1'},
                {'more_data': u'4',
                 'name': u'EXAMPLE TWO',
                 'some_data': u'3'}],
 (u'C', u'D'): [{'more_data': u'2', 'name': u'EXAMPLE', 'some_data': u'1'}]}
于 2012-07-24T11:09:30.853 に答える