Bereiche aus HTML löschen

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.
Antworten
emKa
User
Beiträge: 4
Registriert: Sonntag 1. Februar 2009, 17:42

Sonntag 1. Februar 2009, 17:52

Hallo!

Ich stehe vor folgendem Problem. Ich muss aus einer HTML-Datei bestimmte Bereiche löschen und die HTML-Datei wieder neu abspeichern. Die Bereiche, die aus der HTML-Datei entfernt werden müssen, werden über Kommentar-Tags definiert.

Beispiel:

Code: Alles auswählen

<HTML>
…
<!-- beginn löschen -->
In diesem Bereich soll alles gelöscht werden.
<!-- ende löschen -->
…
</HTML>
Das Laden und Speichern bereitet mir keine Probleme. Nur das Löschen der Bereiche. Es gibt dafür bestimmt mehrere Lösungsansätze. Ich habe auch schon ein wenig mit BaeutifulSoap herum probiert, aber es nicht hinbekommen.

Für Tipps wäre ich sehr dankbar.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Sonntag 1. Februar 2009, 17:58

Wenn du ein POSIX-kompatibles Betriebssystem hast, dann ist sed für so ein Problem viel besser geeignet als Python.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 1. Februar 2009, 18:03

Du kannst diese Datei einfach zeilenweise durchgehen.Ich glaube dass BeautifulSoup Kommentare sowieso ignoriert, also ist es dafür eher wenig geeignet.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Sonntag 1. Februar 2009, 18:09

Code: Alles auswählen

from contextlib import nested

with nested(open("datei.html", "rb"), open("neu.html", "wb")) as (read, write):
    exclude = False
    for line in read:
        if line.strip(" \n") == "<!-- beginn löschen -->":
            exclude = True
        elif line.strip(" \n") == "<!-- ende löschen -->":
            exclude = False
        if not exclude:
            write.write(line)
Nicht getestet.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 1. Februar 2009, 18:24

Ich würde es erst einmal so versuchen:

Code: Alles auswählen

with open(htmlfile, "rb") as f: html = f.read()
re.sub(r"(?s)<!-- beginn löschen -->.*?<!-- ende löschen -->", "", html)
with open(htmlfile, "wb") as f: f.write(html)
Spaßig werden die Umlaute. Ist die HTML-Datei wirklich im ISO-8859-1-Format wie vorgeschrieben? Ist es XHTML im UTF-8-Format? Ein anderes Format? Auch das Encoding der Python-Datei ist wichtig, wenn der Umlaut nicht falsch interpretiert werden soll. Ich hätte daher die Kommentare auf ASCII-Zeichen beschränkt.

Stefan
emKa
User
Beiträge: 4
Registriert: Sonntag 1. Februar 2009, 17:42

Sonntag 1. Februar 2009, 21:45

Danke für die raschen Antworten!

Dass ich mit BeautifulSoap auf dem falschen Dampfer bin habe ich gemerkt. Die zwei Beispiele haben auf an Hieb nicht geklappt, aber ich weiß jetzt in welche Richtung ich jetzt gehen muss. Ich werde mich in den nächsten Tagen genauer damit befassen.

@sma <!-- beginn löschen --> ist nur ein Beispiel. Mit Umlauten wäre es bestimmt lustig geworden ;-)

Nochmals, vielen Dank an alle!
emKa
User
Beiträge: 4
Registriert: Sonntag 1. Februar 2009, 17:42

Donnerstag 5. Februar 2009, 10:15

Nach langem hin und her habe ich eine Lösung gefunden.

In diesem Beispiel wird der gesamte Bereich zwischen <head> und </head> inkl. den Tags entfernt und anschließend wird die neue Datei als neu.html gespeichert.

Code: Alles auswählen

quelle = open("index.html", "r")
ziel = open("neu.html", "w")
exclude = 0
for line in quelle:
  if line.find("<head>") != -1:
    exclude = 1
  if exclude == 0:
    ziel.write(line)
  if line.find("</head>") != -1:
    exclude = 0
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 5. Februar 2009, 10:26

Besser ``True`` und ``False`` verwenden.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 5. Februar 2009, 14:08

...und:

Code: Alles auswählen

if '<head>' in line:
MfG
HWK
emKa
User
Beiträge: 4
Registriert: Sonntag 1. Februar 2009, 17:42

Donnerstag 5. Februar 2009, 17:24

Danke für die Hinweise!
Antworten