[gelöst] Gleichartige Befehle "zusammenfassen" für

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

[gelöst] Gleichartige Befehle "zusammenfassen" für

Beitragvon merlin_emrys » Dienstag 18. September 2007, 21:54

Ich habe mal wieder einen Python-Code erzeugt, der überwiegend aus Wiederholungen besteht.

Jetzt meine Frage: Gibt es irgendwelche anfängertauglichen Methoden, die ganzen Wiederholungen zusammenzufassen?

Der Quelltext (pocoo hat nur Fehlermedlungen gegeben :-( und ich weiß nicht, was man in dem Fall machen kann, deshalb hier):

Code: Alles auswählen

# -*- coding: cp1252 -*-

""" Dokputzer
entfernt überflüssige Formatierungsanweisungen aus von MSWord erzeugten html-Dokumenten"""

import re

# Datei einlesen
Datei = open("Testdatei.html", "r")
Textblock = Datei.read()
Datei.close()

# doppelte Leerzeichen reduzieren
Textblock = Textblock.replace('  ', ' ')

# Umwandeln der deutschen Sonderzeichen 
Textblock = Textblock.replace('ä', 'ä')
Textblock = Textblock.replace('Ä', 'Ä')
Textblock = Textblock.replace('ö', 'ö')
Textblock = Textblock.replace('ö', 'Ö')
Textblock = Textblock.replace('ü', 'ü')
Textblock = Textblock.replace('Ü', 'Ü')
Textblock = Textblock.replace('ß', 'ß')

# überflüssige Zeichen entfernen
Textblock = Textblock.replace(' ', ' ')
Textblock = Textblock.replace('  ', ' ')
Textblock = Textblock.replace('\n', ' ')
Textblock = Textblock.replace('  ', ' ')
Textblock = Textblock.replace(' >', '>')

# spitze Klammern durch wiederzufindende Markierungen ersetzen
Textblock = Textblock.replace(r'<', '<+++')
Textblock = Textblock.replace(r'>', '---<')

# Text in Liste von Einzelausdrücken umwandeln
Textzeilen = Textblock.split(r'<')

Textspeichern = open('Textsp.html', 'w')
Textspeichern.write(str(Textzeilen))
Textspeichern.close()


# Vorgriff: Beizubehaltende endspan-Anweisungen markieren
for Nummer in range(len(Textzeilen)):
    if Nummer > 285:
        if '/span' in Textzeilen[Nummer]:
            for Element in Textzeilen[Nummer:Nummer-10:-1]:
                if '+++span' in Element:
                    if ('SGkClassic' in Element or 'RHebrew' in Element
                        or 'color:red' in Element or 'color:gray' in Element):
                        Textzeilen[Nummer] = '+' + Textzeilen[Nummer]
                        break

# Text durcharbeiten
rekonstruierterText = ''

for Zeile in Textzeilen:
    Zeilenliste = Zeile.split(r'<')
    for Listeneintrag in Zeilenliste:
        if (str(Listeneintrag).startswith('+++meta')
                or str(Listeneintrag).startswith('+++link') or str(Listeneintrag).startswith('+++o:')
                or str(Listeneintrag).startswith('+++w:') or str(Listeneintrag).startswith('+++!')):
            Listeneintrag = []
        if (str(Listeneintrag).startswith('+++/meta') or str(Listeneintrag).startswith('+++/span')
                or str(Listeneintrag).startswith('+++/link') or str(Listeneintrag).startswith('+++/o')
                or str(Listeneintrag).startswith('+++/w') or str(Listeneintrag).startswith('+++/!')):
            Listeneintrag = []
        elif str(Listeneintrag).startswith('++++/span'):
            Listeneintrag = [r'</span>']
        elif str(Listeneintrag).startswith('+++html'):
            Listeneintrag = [r'<html>']
        elif str(Listeneintrag).startswith('+++body'):
            Listeneintrag = [r'<body>']
        elif str(Listeneintrag).startswith('+++p'):
            Listeneintrag = [r'<p>']
        elif str(Listeneintrag).startswith('+++td'):
            Listeneintrag = [r'<td>']
        elif str(Listeneintrag).startswith('+++table'):
            Listeneintrag = [r'<table border=1>']
        elif str(Listeneintrag).startswith('+++span'):
            if 'SGkClassic' in Listeneintrag:
                Listeneintrag = ["<span style='font-family:SGkClassic'>"]
            elif 'RHebrew' in Listeneintrag:
                Listeneintrag = ["<span style='font-family:RHebrew'>"]
            elif 'color:red' in Listeneintrag:
                Listeneintrag = ["<span style='color:red'>"]
            elif 'color:gray' in Listeneintrag:
                Listeneintrag = ["<span style='color:gray'>"]
            else:
                Listeneintrag = []

        if str(Listeneintrag).startswith('+++'):
            Listeneintrag = ['<' + str(Listeneintrag[3:])]
        if '---' in str(Listeneintrag):
            Listeneintrag = [str(Listeneintrag)[2:-2].replace('---', '>')]
         
        rekonstruierterText = rekonstruierterText + str(Listeneintrag)

# Text bereinigen   
rekonstruierterText = rekonstruierterText.replace(r"['", "")
rekonstruierterText = rekonstruierterText.replace(r"[", "")
rekonstruierterText = rekonstruierterText.replace(r"']", "")
rekonstruierterText = rekonstruierterText.replace(r"]", "")

rekonstruierterText = rekonstruierterText.replace('\n', ' ')

rekonstruierterText = rekonstruierterText.replace(r"</p> <p>", r"<br>\n")
rekonstruierterText = rekonstruierterText.replace(r"</p> <p> </span></p> <p>","</p> <p>")
rekonstruierterText = rekonstruierterText.replace('<p>', '\n<p>')
rekonstruierterText = rekonstruierterText.replace('<tr>', '\n<tr>')
rekonstruierterText = rekonstruierterText.replace('<td>', '\n<td>')
rekonstruierterText = rekonstruierterText.replace('>"', '> ')
rekonstruierterText = rekonstruierterText.replace('> "', '> ')

# Datei erstellen
Neufassung = open('Testausgabe.html', 'w')
Neufassung.write(rekonstruierterText)
Neufassung.close()



Zum Hintergrund:
Ich muß hin und wieder Worddokumente in html umwandeln. Nun ist das von Word automatisch erzeugte html ziemlich haarsträubend. Dieser "Dokputzer" entfernt die meisten überflüssigen Formatierungsanweisungen. Beibehalten werden müssen derzeit nur vier Anweisungen: zwei Schriftarten (Griechisch und Hebräisch) sowie Farbmarkierungen in grau und rot und ein paar grundsätzliche Elemente. Ich bekomme dadurch eine Gößenreduktion der Dateien auf rund 1/5, ohne daß sich am dargestellten Inhalt etwas ändert...
Zuletzt geändert von merlin_emrys am Mittwoch 19. September 2007, 13:20, insgesamt 1-mal geändert.
BlackJack

Beitragvon BlackJack » Dienstag 18. September 2007, 22:36

Du musst identifizieren was gleich bleibt und was sich ändert und letzteres aus dem Quelltext herausziehen. Bei den ganzen `replace()`-Aufrufen ändern sich zum Beispiel die Argumente.

Code: Alles auswählen

text = text.replace('a', 'b')
text = text.replace('x', 'u')
text = text.replace('spam', 'eggs')

# =>

for old, new in (('a', 'b'), ('x', 'u'), ('spam', 'eggs')):
    text = text.replace(old, new)


HTML so zu verarbeiten ist nicht besonders sauber. Als erstes solltest Du vielleicht mal tidy in Betracht ziehen. Das ist speziell für HTML gedacht und räumt "Word-HTML" ganz gut auf.

Für die speziell auf Deine Wünsche zugeschnittene Nachbearbeitung könnte man dann einen HTML-Parser wie `BeautifulSoup` oder einen XML-Parser wie ElementTree oder BeautifulStoneSoup benutzen.
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Beitragvon merlin_emrys » Dienstag 18. September 2007, 23:03

@BlackJack: Danke! Ich geh dann morgen mal ans Aufräumen bzw. Kürzen.

BlackJack hat geschrieben:HTML so zu verarbeiten ist nicht besonders sauber. Als erstes solltest Du vielleicht mal tidy in Betracht ziehen. Das ist speziell für HTML gedacht und räumt "Word-HTML" ganz gut auf.

Die Frage ist dann nur, ob ich schnell genug lerne, damit umzugehen... Bei den HTML-Parsern tippe ich mal drauf, daß ich erstmal tagelang in der Dokumentation wühlen muß, bevor ich überhaupt ahne, warum nichts funktioniert. Bei Tidy bin ich mir auch nicht ganz sicher - in der Dokumentation steht, daß es überflüssige Befehle zu eliminieren versucht, aber mehr auch nicht, vor allem nicht, wie ich dem Programm beibringe, daß die Formatanweisungen für die font-familiy manchmal wichtig sind und trotzdem überwiegend gelöscht werden sollen. Soweit ich bisher gelesen habe, kann ich nur generell sagen, es soll das Dokument "putzen", aber nicht, was es beibehalten soll und was nicht?

Dies Python-Programm hat mich immerhin bisher nur zwei Tage gekostet... ;-) Mit dem "Kürzen" sind es vielleicht drei. - Daß es ziemlich grob mit dem Text umgeht, ist zweifellos richtig. Aber es tut halbwegs, was ich von ihm will (ich müsste irgendwie noch hinbekommen, daß es die Absätze nicht vollständig eliminiert, und dann muß ich jeweils noch ein paar Dinge von Hand löschen), und das ohne zusätzliche Programminstallation und weiteren Lernaufwand.

Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot]