2012-07-24 88 views
0

標籤我有一個包含數據的以下類型和結構的文件:提取物和族元素/與BeautifulSoup

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

在此確切結構的數據繼續在文件中的最內<data>...</data>異常標籤可以重複n次,數據結構始終以<data>標籤開始,然後繼續使用<from>...</from><to>...</to>標籤。

我想要做的是提取最外面的<data>標籤與<to><from>之間的所有數據作爲數據塊的描述。我當然也希望將最內部的<data>標籤彼此分開,並以某種方式保存這些數據,以便清楚地看到最外面的數據與父數據相關。

我沒有確切的想法,我想如何保存數據,所以任何示例表示讚賞!

我用Python模塊BeautifulSoup測試了這個,並且在這裏搜索並閱讀了很多例子,但是還沒有找到任何可以指向正確方向的東西。

謝謝!

回答

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'}]} 
+0

太好了!這幾乎是它,我也想要提取父內的每個可能的內部數據塊。我更新了示例代碼以使其更清晰! – Mike 2012-07-24 12:16:19

+0

@Mike:我已更新代碼以考慮您編輯的輸入數據。請注意,返回原點並創建格式良好的XML樹是理想的選擇。我添加了一種將每個塊存儲在字典中的方法,然後您可以用現在應該相當簡單的方式來檢查。 – gauden 2012-07-24 18:57:36

+0

太棒了,解決了!謝謝! – Mike 2012-07-25 09:45:10