我正在尝试使用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解析的足够文档?
答案 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实现。