2016-10-20 1 views
-2

Ich analysiere Text aus einer XML-Datei. Parsing funktioniert gut, und ich kann die Ergebnisse vollständig ausdrucken, aber wenn ich versuche, den Text in ein Textdokument zu schreiben, ist alles, was ich in das Dokument bekomme, das letzte Element.Python - Exportiere XML in txt-Datei mit

from bs4 import BeautifulSoup 
import urllib.request 
import sys 

req = urllib.request.urlopen('file:///C:/Users/John/Desktop/Dow%20Jones/compaq%20neg%201.xml') 

xml = BeautifulSoup(req, 'xml') 

for item in xml.findAll('paragraph'): 
    sys.stdout = open('CN1.txt', 'w') 
    print(item.text) 
    sys.stdout.close() 

Was fehlt mir hier?

+0

Das Überschreiben von 'sys.stdout', während es unterstützt wird, ist ... eine ungewöhnliche Wahl. Gibt es einen Grund, warum Sie das Dateihandle nicht unter einem anderen Namen speichern und dann 'f.write()' oder ähnliches verwenden? –

+0

Übrigens gibt es zu dieser Frage nichts XML-spezifisches. Es könnte zum Beispiel vereinfacht werden für 'Item in [" Hallo "," Grausamkeit "," Welt "]:' ohne XML-bezogenen Code überhaupt, und Sie hätten immer noch das gleiche Verhalten (nur die die letzte Zeichenkette, über die Sie in Ihrer Ausgabedatei getippt haben). –

+0

Ich bin brandneu mit der Arbeit mit XML und dem Schreiben von Python. Ich habe mit R ähnlich gemacht, aber nicht mit Python. – John

Antwort

1

Es sieht so aus, als ob Sie die Datei jedes Mal öffnen, wenn Sie die Schleife durchlaufen, was mich überrascht, dass Sie es tun können. Wenn es die Datei öffnet, öffnet es es im Schreibmodus und löscht daher alles, was beim letzten Durchgang durch die Schleife darin war.

+1

Warum ist es überraschend? Selbst wenn es keinen expliziten Abschluss gibt, lässt jede POSIXy-Plattform eine Datei gleichzeitig zum Schreiben durch mehr als einen Prozess offen, es sei denn, es werden explizite Sperrschritte ausgeführt. –

+0

Es ist sehr lange her, seit ich alles codiert habe, was man POSIXy nennen könnte. Ich nahm an, dass das einen Fehler erzeugen würde, da mir beigebracht wurde, dass dies eine schlechte Sache ist (im Allgemeinen). Danke für die Information. – konsta