2012-07-24 111 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