Dominique Stender: HTML Tags ausschneiden

Hallo!

Ich muß mal wieder ein Standardproblem lösen, habe aber keine Ahnung wie.
Ich habe ein Shellprogramm geschrieben - insofern ist der Themenbereich irreführend - , was eine beliebige HTML Seite aus dem Netz holt. Als nächster Schritt sollen alle HTML Tags entfernt werden, also alle Zeichenketten, die zwischen < und > eingeschlossen sind.
Reguläre Audrücke werden in der Shell genauso verarbeitet wie in Perl, also sollte das kein Problem sein

Ein Aufruf (Perl)
tr /<[a-zA-Z0-9äöüß]>//
oder (Shell)
tr -d '<[a-zA-Z0-9äöüß]'
löscht aber den kompletten Text, nicht nur die Tags.

Was mache ich falsch?
Danke!
   Dominique

  1. Hallo Dominique

    Ein Aufruf (Perl)
    tr /<[a-zA-Z0-9äöüß]>//
    oder (Shell)
    tr -d '<[a-zA-Z0-9äöüß]'
    löscht aber den kompletten Text, nicht nur die Tags.

    Ich wuerde wahrscheinlich so was probieren wie:

    foreach $Zeile (@Inputzeilen) # vorher eingelesen
    {
    $Zeile =~ s/<.*?>//gi;
    push(@Outputzeilen,$Zeile);
    }

    Und @Outputzeilen dann hinterher in die Datei zurueckschreiben.

    viele Gruesse
      Stefan Muenz

    1. Ein Aufruf (Perl)
      tr /<[a-zA-Z0-9äöüß]>//
      oder (Shell)
      tr -d '<[a-zA-Z0-9äöüß]'
      löscht aber den kompletten Text, nicht nur die Tags.

      Klar - tr ist nicht kontextsensitiv genug.
      Ich vermute, mit awk kann man das Problem lösen, aber ich kann nicht gut genug awk, um selbst eine Lösung hinzuschreiben.
      Wenn Perl vorhanden ist, würde ich Perl nehmen.

      Ich wuerde wahrscheinlich so was probieren wie:
      foreach $Zeile (@Inputzeilen) # vorher eingelesen
      {

      »»  $Zeile =~ s/<.*?>//gi;
      »»  push(@Outputzeilen,$Zeile);

      }
      Und @Outputzeilen dann hinterher in die Datei zurueckschreiben.

      Dasselbe Problem hatte ich bei meinem "SiteMap-Generator" (der parst aus HTML-Dokument bisher gerade mal das <TITLE>-Tag heraus).

      Weil ich mich aber nicht darauf verlassen will, daß Tags in derselben Zeile geschlossen werden, habe ich zunächst den gesamten Dateiinhalt in eine Variable eingelesen und darin dann entsprechende regular expressions ausgeführt.

      Natürlich kann ein solcher Tags-Stripper nur funktionieren, wenn das HTML-Dokument syntaktisch in Ordnung ist. Wenn da jemand das Zeichen "<" in den normalen Text geschrieben hat, dann werden die meisten Browser das verkraften - aber der "Stripper" nicht.

  2. hi!

    Ich habe ein Shellprogramm geschrieben - insofern ist der Themenbereich irreführend - , was
    eine beliebige HTML Seite aus dem Netz holt. Als nächster Schritt sollen alle HTML Tags
    entfernt werden, also alle Zeichenketten, die zwischen < und > eingeschlossen sind.

    Wenn es keine zeilenübergreifenden HTML-Tags gibt, lässt es sich auf jeden Fall so lösen, wie Stefan es geschrieben hat.

    Ein Aufruf (Perl)
    tr /<[a-zA-Z0-9äöüß]>//
    oder (Shell)
    tr -d '<[a-zA-Z0-9äöüß]'
    löscht aber den kompletten Text, nicht nur die Tags.
    Was mache ich falsch?

    tr// erwartet keinen regulären Ausdruck, sondern ersetzt jeweils das vorne angegebene Zeichen durch eines, das hinten an gleicher Stelle steht. Insofern ist es natürlich für diesen Zweck ungeeignet.

    bye, Frank!

  3. Hi,

    tr /<[a-zA-Z0-9äöüß]>//
    oder (Shell)
    tr -d '<[a-zA-Z0-9äöüß]'
    löscht aber den kompletten Text, nicht nur die Tags.

    warum da überhaupt was gelöscht wird ist mir schleierhaft - augenscheinlich reagiert die Shell doch anders als Perl :-)

    Also, Du willst suchen und ersetzen, also "s///g" (g für global, also mehrmals). Du willst durch nichts ersetzen, das vereinfacht den zweiten Teil ;-) Nun willst Du aber HTML-Tags löschen. Ich versuche es mal:

    s/<[^<]+?>//g;

    Hier wird folgendes gematched: "<", gefolgt von "mindestens einem Zeichen aus der Menge aller Zeichen ohne '<'", durch das Fragezeichen wird noch einmal die "Gier" aus der RegExp genommen. Am Ende folgt noch ein ">".

    Das Problem hierbei ist, daß z.B. <img alt="<text>"> nicht mehr vollständig gematched wird, aber mit einer einfachen RegExp kriegst Du das nicht hin.

    Hope it helps :-)

    Cheatah

    1. hi!

      Das Problem hierbei ist, daß z.B. <img alt="<text>"> nicht mehr vollständig gematched
      wird, aber mit einer einfachen RegExp kriegst Du das nicht hin.

      Das ist auch kein gültiges HTML. Wenn er sowas verwendet, ist er selbst schuld ;-)

      bye, Frank!

      1. Hi,

        Das Problem hierbei ist, daß z.B. <img alt="<text>"> nicht mehr vollständig gematched
        wird, aber mit einer einfachen RegExp kriegst Du das nicht hin.

        Das ist auch kein gültiges HTML. Wenn er sowas verwendet, ist er selbst schuld ;-)

        *g* da hast Du recht :-) allerdings wollte ich nur auf mögliche Fehlerquellen aufmerksam machen.

        A propos: Deine Grafik scheint nicht gefunden zu werden, daher wird der Seitenaufbau extrem verzögert (wenn man nicht abbricht). Es wäre ganz nett, wenn Du zeitweise drauf verzichten könntest... :-)

        Cheatah

        1. hi!

          A propos: Deine Grafik scheint nicht gefunden zu werden, daher wird der Seitenaufbau
          extrem verzögert (wenn man nicht abbricht). Es wäre ganz nett, wenn Du zeitweise drauf
          verzichten könntest... :-)

          Ist nicht meine Schuld, die Grafik ist da. Leider ist der Server heute anscheinend nicht erreichbar :-((

          bye, Frank!

          1. Hi,

            Ist nicht meine Schuld, die Grafik ist da. Leider ist der Server heute anscheinend nicht erreichbar :-((

            genau darum wäre es nett, eben mal für kurze Zeit auf die Grafik zu verzichten. In einigen Tagen wandern die Artikel ins Archiv, und zwar ohne Grafik. Und da ohnehin kein nenneswerter Nutzwert drin steckt finde ich, daß es nur von Rücksichtnahme zeugen würde, sie eben bis dahin (bzw. bis der Server wieder erreichbar ist) nicht zu posten.

            Ist aber nur meine Meinung.

            Cheatah