ich bin gerade dabei Text-Dateien mit XML-Struktur zu parsen. Folgender Link zeigt euch zur Veranschaulichung eine Beispiel-Datei:
https://www.sec.gov/Archives/edgar/data ... 003763.txt
Die Dateien habe ich bereits heruntergelanden und aufgrund von Performance-Problemen um die ersten Zeilen gekürzt (mit einem anderen Code), sodass die untersuchten Dateien bei "<?xml version="1.0"?>" beginnen.
Zu meinem Code:
Die einzelnen Textdokumente werden nach bestimmten "Tags" durchsucht. Anschließend wird in einer CSV-Datei pro Zeile der Output von einem Dokument wiedergegeben und die herausgelesenen Informationen nacheinander in Spalten erfasst. Allerdings sind in manchen Text-Dokumenten einige Informationen mehrfach vorhanden, da z.b. mehrere Personen (in BspDatei ReportingOwner) in einer Datei aufgeführt werden. Dies führt dazu, dass mein bisheriger Code die Informationen in den vorgesehenen Zellen überschreibt und nicht automatisch in die nächste freie Zelle springt, sodass am Ende nur eine Person in meiner CSV-Datei erfasst wurde.
Hier mein Code:
Code: Alles auswählen
import csv
import glob
import re
import string
import time
import bs4 as bs
# User defined directory for files to be parsed
TARGET_FILES = r'D:\Files\**'
# User defined output file
OUTPUT_FILE = r'D:\Output\outputfile.csv'
# Setup output
OUTPUT_FIELDS = [r'Datei',r'IssuerCIK', r'issuerName', r'ReOwnerCIK', r'ReOwnerCIK', r'transactionDate', r'transactionsCode', r'Director', r'Officer', r'Titel', r'10-% Eigner', r'sonstiges', r'SignatureDate']
def main():
f_out = open(OUTPUT_FILE, 'w')
wr = csv.writer(f_out, lineterminator='\n', delimiter=';')
wr.writerow(OUTPUT_FIELDS)
file_list = glob.glob(TARGET_FILES)
for file in file_list:
print(file)
with open(file, 'r', encoding='UTF-8', errors='ignore') as f_in:
soup = bs.BeautifulSoup(f_in, 'xml')
output_data = get_data(soup)
output_data[0] = file # the number determine the column for the output
wr.writerow(output_data)
def get_data(soup):
odata = [0] *200
Iscik = soup.find_all('issuerCik')
Iname = soup.find_all('issuerName')
Owncik = soup.find_all('rptOwnerCik')
name = soup.find_all('rptOwnerName')
direct = soup.find_all('isDirector')
off = soup.find_all('isOfficer')
ten = soup.find_all('isTenPercentOwner')
other = soup.find_all('isOther')
titel = soup.find_all('officerTitle')
for x in range(0, len(Iscik)):
try:
odata[1]= (Iscik[x].get_text())
except IndexError:
odata[1]= ('ka')
try:
odata[2]= (Iname[x].get_text())
except IndexError:
odata[2]= ('ka')
for ii in range(0, len(Owncik)):
try:
for i in range(3, 33):
odata[i] = (Owncik[ii].get_text())
except IndexError:
for i in range( 3, 33):
odata[i] =('ka')
try:
for i in range(33, 63):
odata[i] =(name[ii].get_text())
except IndexError:
for i in range(33, 63):
odata[i] =('ka')
try:
for i in range(63, 93):
odata[i] =(direct[ii].get_text())
except IndexError:
for i in range(63, 93):
odata[i] =('ka')
return odata
if __name__ == '__main__':
print('\n' + time.strftime('%c') + '\nGeneric_Parser.py\n')
main()
print('\n' + time.strftime('%c') + '\nNormal termination.')
Wie kann ich meinen Code so anpassen, dass die Info automatisch in die nächste Zelle geschrieben wird?
Ich hoffe jmd hat hier eine Idee und kann mir evtl weiterhelfen. Jeder Tipp ist willkommen! Vielen Dank!