2017-01-13 4 views
0

Guten Morgen alle; Ich versuche, SGML-Dokumente mit diesem Code zu extrahieren, aber ich habe leere Dokumente als Ergebnis, das ist mein Python-Code:Python text.strip() gibt leer

from os import listdir 
from os import makedirs 
from os.path import isfile, join 
from re import sub 
import ast 
import numpy 
import xml.etree.ElementTree as ElementTree 
from lxml import etree 

parser = etree.XMLParser(recover=True) # escaping malformed strings 
pathCol="C:/Users/Desktop/FR" 
pathExtr="C:/Users/Desktop/FRExt" 
i=0 
for f in listdir(pathCol): 
    with open(join(pathCol,f), 'r') as f: # Reading file 
     xml = f.read() 

    xml = '<ROOT>' + xml + '</ROOT>' # Let's add a root tag 
    root = etree.fromstring(xml, parser=parser) 
    for doc in root: 
     try : 
      docNo=doc.find('DOCNO').text.strip() 
     except : 
      i+=1 
      docNo="LATIMES"+str(i) 
     try : 
      text=doc.find('TEXT').text.strip() 
     except : 
      try : 
       text=doc.find('HEADLINE').text.strip() 
      except : 
       try : 
        text=doc.find('GRAPHIC').text.strip() 
       except : 
        text=" " 

     fi=open(join(pathExtr,docNo),'w') 
     fi.write(text) 
     fi.close() 
     print("%s OK" %(docNo)) 
    f.close() 

Und dies ist eine Struktur eines Beispieldokument:

<DOC> 
<DOCNO> LA010189-0001 </DOCNO> 
<DOCID> 1 </DOCID> 
<DATE> 
<P> 
January 1, 1989, Sunday, Home Edition 
</P> 
</DATE> 
<SECTION> 
<P> 
Book Review; Page 1; Book Review Desk 
</P> 
</SECTION> 
<LENGTH> 
<P> 
1206 words 
</P> 
</LENGTH> 
<HEADLINE> 
<P> 
NEW FALLOUT FROM CHERNOBYL; 
</P> 
<P> 
THE SOCIAL IMPACT OF THE ... 
</P> 
</HEADLINE> 
<BYLINE> 
<P> 
By James E. ... 
</P> 
</BYLINE> 
<TEXT> 
<P> 
The onset of the new Gorbachev policy of glasnost,... 
</P> 
... 
</TEXT> 
</DOC> 
<DOC> 
... etc 
</DOC> 

ich möchte den Inhalt zwischen <TEXT> Etiketten für jedes Dokument zwischen <DOC> und </DOC> bekommen, stattdessen habe ich leere Dokumente bekam :( Bitte, gibt es jemanden, der mir helfen kann? vielen Dank.

Antwort

0

Es gibt keine text node im //ROOT/DOC/TEXTElement, deshalb gibt doc.find('TEXT').text eine leere Zeichenfolge zurück.

Stattdessen gibt es Element Knoten (aka <P>), die Sie durchlaufen können.

schließlich zu 'stringify' ein Element, können Sie ET.tostring()

TLDR

text = ''.join(map(ET.tostring, doc.find('TEXT'))).strip() 
+0

für die Beantwortung Danke verwenden, ich werde wie dies versuchen. –