如何使用美丽的汤来解析这个xml文件?

时间:2014-10-21 07:14:45

标签: python xml xml-parsing beautifulsoup

我正在尝试使用Beautiful Soup来解析xml文件,我尝试在Crummy上阅读BS的文档,但找不到满足xml解析的任何内容。现在,我已经能够解决这个问题:

file = open("input.xml")
page = file.read()

soup = BeautifulSoup(page, "xml")
for word in soup.findAll('word'):
    word_attr = dict(word.attrs)
    netag = word.find('ner')
    nertag = dict(netag)
    print ("STOP", nertag['ner'])

但是,它没有做任何事情。 我的xml文件格式为:

<?xml version="1.0" encoding="utf-8"?>
<root>
 <document>
  <sentences>
   <sentence id="1">
    <tokens>
     <token id="1">
      <word>
       Starbucks
      </word>
      <lemma>
       Starbucks
      </lemma>
      <CharacterOffsetBegin>
       0
      </CharacterOffsetBegin>
      <CharacterOffsetEnd>
       9
      </CharacterOffsetEnd>
      <POS>
       NNP
      </POS>
      <NER>
       ORGANIZATION
      </NER>
     </token>
     <token id="2">
      <word>
       to
      </word>
      <lemma>
       to
      </lemma>
      <CharacterOffsetBegin>
       10
      </CharacterOffsetBegin>
      <CharacterOffsetEnd>
       12
      </CharacterOffsetEnd>
      <POS>
       TO
      </POS>
      <NER>
       O
      </NER>
     </token>
<token id="5">
  <word>
   .
  </word>
  <lemma>
   .
  </lemma>
  <CharacterOffsetBegin>
   263
  </CharacterOffsetBegin>
  <CharacterOffsetEnd>
   264
  </CharacterOffsetEnd>
  <POS>
   .
  </POS>
  <NER>
   O
  </NER>
 </token>
 </tokens>
   </sentence>
  </sentences>
 </document>
</root>

我要做的是提取NER值,用&#34; STOP&#34;删除句点标点,然后将其写入另一个txt文件。

喜欢句子:Starbucks in New York is good.(用xml编写) 应该给:ORGANIZATION in LOCATION is good STOP

请问有人可以帮我怎么做?或者为我提供有关Beautiful Soup xml解析的足够文档?

1 个答案:

答案 0 :(得分:1)

你需要寻找一个兄弟标签;无论是下一个还是上一个兄弟都没问题,在这一点上它会更容易先去父母:

for word in soup.find_all('word'):
    ner = word.parent.find('NER')
    if not ner: continue
    print '{} in {} is good'.format(ner.string.strip(), word.string.strip())

演示:

>>> for word in soup.find_all('word'):
...     ner = word.parent.find('NER')
...     if not ner: continue
...     print '{} in {} is good'.format(ner.string.strip(), word.string.strip())
... 
ORGANIZATION in Starbucks is good
O in to is good
O in . is good

然而,您可以使用xml.etree.ElementTree API执行此任务;它就像BeautifulSoup一样能够处理XML。由于您显然已经安装了lxml,因此可以使用他们的ElementTree实现。