2017-08-11 24 views
0

以下のXMLから人名を抽出する必要があります。私は以下のコードを使用して、出力を得ました(ORIGINAL)。しかし、私は欠けているアイテムも欲しいです。PythonでBeautiful Soupを使って欠けているサブタグを追加する

第4人のミドルネームは見つからないので、抽出されるのは3つの名前だけです。

サンプルXML:

<author> 
    <persName> 
     <forename>Esayas</forename> 
     <middlename>K</middlename> 
     <surname>Gudina</surname> 
    <lb/> 
     <marker>1*</marker>, 
    </persName> 
    <persName> 
     <forename>Solomon</forename> 
     <middlename>T</middlename> 
     <surname>Amade</surname> 
    <lb/> 
     <marker>2</marker> , 
    </persName> 
    <persName> 
     <forename>Fessahaye</forename> 
     <middlename>A</middlename> 
     <surname>Tesfamichael</surname> 
    <lb/> 
     <marker>3</marker> and 
    </persName> 
    <persName> 
     <forename>Rana</forename> 
     <surname>Ram</surname> 
    <lb/> 
     <marker>4</marker> 
    </persName> 
</author> 

コード:

from bs4 import BeautifulSoup as bs 
import codecs 

name = [] 

with codecs.open("D:/...../2F1472-6823-11-19.authors.tei.xml", "r", "utf-8") as infile: 
    soup = bs(infile, "html5lib")  

pn = soup.find_all('persname') 


for i in pn: 
    try: 
     if len((i.find('forename')).text) != 0: 
      fn = (i.find('forename')).text 
     else: 
      fn ="" 
     if len((i.find('middlename')).text) != 0: 
      mn = (i.find('middlename')).text 
     else: 
      mn="" 
     if len((i.find('surname')).text) != 0: 
      sn = (i.find('surname')).text 
     else: 
      sn ="" 
     name.append(fn+" "+mn+" "+sn) 
    except: 
     print ("") 

出力:

INDEX TYPE  SIZE VALUE 
0  unicode  1  Esayas K Gudina 
1  unicode  1  Solomon T Amade 
2  unicode  1  Fessahaye A Tesfamichael 

予想される出力:

INDEX TYPE  SIZE VALUE 
0  unicode  1  Esayas K Gudina 
1  unicode  1  Solomon T Amade 
2  unicode  1  Fessahaye A Tesfamichael 
3  unicode  1  Rana Ram 
+0

唯一のミドルネームが見つかった場合は、結果を捨てるだろうか?タグが間違っていて、それが実際にファーストネームだったと思いますか?姓がついていたら?それぞれの可能な場合に何をしたいのかを決定し、コード内でそれを考慮する必要があるようです。 – Aaron

答えて

0

これを試してみてください:

from bs4 import BeautifulSoup as bs 
import codecs 

name = [] 

with codecs.open("tei.xml", "r", "utf-8") as infile: 
    soup = bs(infile, "html5lib") 
pn = soup.find_all('persname') 


for i in pn: 
    try: 
     if i.find('forename') is not None and len(i.find('forename').text) != 0: 
      fn = (i.find('forename')).text 
     else: 
      fn ="" 
     if i.find('middlename') is not None and len(i.find('middlename').text) != 0: 
      mn = i.find('middlename').text 
     else: 
      mn="" 
     if i.find('surname') is not None and len(i.find('surname').text) != 0: 
      sn = i.find('surname').text 
     else: 
      sn ="" 
     name.append(fn+" "+mn+" "+sn) 
    except: 
     print ("") 
print (name) 

出力:

[u'Esayas K Gudina', u'Solomon T Amade', u'Fessahaye A Tesfamichael', u'Rana Ram'] 
+0

ここで 'try'ブロックを使うのは、それが解決するよりも多くの問題を引き起こしているようです。 – Aaron

+1

@Aaronあなたはおそらく正しいですが、私は元のポスターのコードをできるだけ変更したくありませんでした。 –

関連する問題