[GELÖST] Lynx/Sed - Text filtern (Lösung inkl. Excel Sheet)

HobbyStern

Aktives Mitglied
Mitglied seit
5 Dez 2005
Beiträge
1,844
Punkte für Reaktionen
0
Punkte
36
Hallo Gemeinde,

Ich rufe die Webseite http://www.allewetter.de/nordrhein_westfalen.html ab und speichere diese mit lynx ab. Nun müsste ich die pipe nutzen um die Ausgabe auf den wesentlichen Teil zu filtern.

zZt. ist in der Seite extrem viel vorhanden was ich nicht benötige, relevant ist dieser Teil

Code:
Niederrhein, Ruhr, Münsterland3-Tagesprognose       Tagestemperaturen           
   Donnerstag 06.12.2007 5° bis 10°C       Regen      [pc_7.gif]  80 %
   Freitag    07.12.2007 7° bis 13°C       Regen      [pc_7.gif]  80 %
Wobei mich nur der Teil "Regen" und die Temperatur der Region "Münsterland" interessiert.
Wie kann ich sed nun sagen das er alles filtern soll bis auf diese Einträge ? Geht das überhaupt ? Das Format scheint nicht stark zu variieren.

Danke für Eure Hilfe !

Grüsse, Stefan
 
Zuletzt bearbeitet:
Hier mal ein kleines Beispiel. Bei den echo-Befehlen kann man die einzelnen Spalten auf Wunsch noch mit awk "anhübschen". Die [gif]-Verweise hab' ich mal via sed mit rausgeschmissen.

PHP:
#! /bin/bash

# 20 Zeilen der Webseite ab "Niederrhein" nach $$.tmp speichern
lynx http://www.allewetter.de/nordrhein_westfalen.html --dump --nolist --connect_timeout=5 | grep Niederrhein -A 20 > $$.tmp
i=1 # Zeilenzähler
j=0 # Blockzähler
cat $$.tmp | while read line; do
        line1=`echo $line | sed -e 's/^\s*//'` # Alle führenden Leerzeichen entfernen
        if [ ${#line1} -eq 0 -a $j -eq 0 ]; then # Fells es eine Leerzeile ist, Blockzähler erhöhen und Zeilenzähler rücketzen
                i=0
                j=1
        fi
        if [ $j -eq 0 ]; then # Erster Block - zwei Zeilen Überschrift
                if [ $i -eq 1 -o $i -eq 2 ]; then
                        echo $line | sed -e 's/^\s*//'
                fi
        elif [ $j -eq 1 ]; then # Zweiter Block - Überschrift und drei Tage
                if [ $i -gt 0 -a $i -lt 5 ]; then
                        echo $line | sed -e 's/^\s*//' | sed -e 's/\[.*\]//' # Ausdruck innerhalb von [] löschen
                fi
        fi
        i=$((i+1)) # Zeilenzähler inkrementieren
done
rm -rf $$.tmp # Tempfile löschen

Es möge nützen
 
Hi Stefan,

als Inspiration hier noch eine Variante von mir, die nur sed benutzt (und meiner Meinung nach deutlich besser lesbar ist).
PHP:
#!/bin/bash
url="http://www.allewetter.de/nordrhein_westfalen.html"
lynx --dump --nolist -display_charset=utf8 "$url" | sed -n -e '
    /Münsterland/,/____/ {
        /Münsterland/ p
        /3-Tagesprognose/,/^\s*$/ p  
    }
'
(Gibt das aus, was du oben angegeben hast. Mir war nicht ganz klar, ob du Temperaturen und Niederschläge noch weiter aus den Zeilen extrahieren möchtest.)

Gruß,

Andreas
 
@buehmann: Auf die Idee war ich nicht gekommen. Damit geht's dann natürlich auch als 'Einzeiler' und im Sinne des Weglassens führender Leerzeichen und der [gifs] mit

PHP:
lynx --dump --nolist -display_charset=utf8 "http://www.allewetter.de/nordrhein_westfalen.html" | sed -n -e '
    /Münsterland/,/____/ {
        /Münsterland/ p
        /3-Tagesprognose/,/^\s*$/ p
    }
' | sed -e 's/^\s*//;s/\[.*\]//'

Nochmal: Gute Idee und wesentlich eleganter als mein Ansatz :)
 
@abw1oim: Danke für die Anerkennung :bier:

Das Entfernen der führenden Leerzeichen und Bilder könnte man übrigens auch lynx direkt erledigen lassen:
PHP:
lynx -dump -nomargins -pseudo_inlines=off ...
:grin:

Schönes Wochenende,

Andreas
 
@buehmann:

Das geht - aber leider nach meiner Erfahrung nur ab einer bestimmten lynx-Version. Der Parameter -- nomargins scheint noch nicht allzu lange unterstützt zu werden. (Mit lynx 2.8.6.rel.5 vom Mai 2007 funktioniert es, mit diversen vorherigen Versionen nach anderer Erfahrung hier im Forum scheinbar nicht).
 
Hey ihr zwei,

ich denke da darf ich eine Runde :bier: ausgeben und ein großes Danke sagen ;)

Denn : Ich hatte mir als Workaround das ganze in Excel zusammengeschneidert, als lynx dump in eine Textdatei, diese dann in excel importieren, dann die zeilen nummerieren und nach niederrhein suchen, dann nach den zeilennummern suchen, dann diese zeilen prüfen und ggf. extrahieren - das ganze geht auch nur stampfe ich es dank, besser und stabilerer Lösungen von euch nun ein.

Ich sag nochmals DANKE für den kleinen Ausflug in das Land der Pipes, awk und sed und ich bin euch zutiefst dankbar so eine mundfertige Lösung bekommen zu haben. Ich kann das ganze dann nachher mit excel verfeinert auch gerne hier einstellen falls noch jemand aktuelle wetterdaten in formularen benötigt (in meinem fall ein bestellblatt - mit der anmerkung frei geschrieben "hey - pass auf - morgen regnet es" :)

Grüsse und ein schönes Wochenende,

Stefan
 
Hallo Andreas und Buehmann,

ich muss bin gerade dabei eure Lösung an einem ruhigen Abend mit einer Flasche Bier zu übernehmen - ich scheine etwas durch den Wind aber :

Wie kann ich den nun gefilterten Inhalt in eine Datei bringen, greife ich die Pipe nach Beendigung ab ist im vorletzten Beispiel nichts mehr übrig..

Ich muss ehrlich gestehen das mir der Einsatz von SED immer noch etwas fern ist - wenn ich SED auch als eines der besten Linux-Kommandozeilen-Werkzeuge nennen würde, neben GREP und der Tabulatortaste..

Danke für Eure Hilfe (vielmals!) - gäbe es virtuelles Bier - ich würde welche kalt stellen :D

Grüsse, Stefan

[EDIT]
Ich habe hier mal meine Lösung in Excel mit eingestellt - für jemanden der ggf. auch einmal vor dem Problem steht Wetter in Excel bekommen zu müssen - denn Google bleibt zu diesem Thema stumm. Zur Mappe - alle meine Daten habe ich entfernt - es sind nur ein Haufen Formeln und Verweise noch da, sowie die Abholung der Wetterdatendatei, die Auswahl des Wochentages sowie der "Bestellschein"....wenn jemand Fragen dazu hat - PM.
 

Anhänge

  • Bestellschein.xls
    208 KB · Aufrufe: 0
Zuletzt bearbeitet:
Hallo Stefan,

nimm mal statt Pipe eine Ausgabeumleitung, dann klappt das auch :D:

PHP:
#!/bin/bash
url="http://www.allewetter.de/nordrhein_westfalen.html"
lynx --dump --nolist -display_charset=utf8 "$url" | sed -n -e '
    /Münsterland/,/____/ {
        /Münsterland/ p
        /3-Tagesprognose/,/^\s*$/ p  
    }
'  > test.txt

Gruß Olaf
 
Hallo Olaf,

ich sag ja - Wald und Bäume, nun - so wie Du es löst (mit dem umlenken von stdout) habe ich es natürlich auch versucht, der Wald scheint dicht bewaldet zu sein ... denn :

test.txt
Code:
 [ Read 0 lines ]


Du hast das ganze bei Dir ausprobiert ? So kann ich die eigene Blindheit als Fehler einkreisen ;)

Grüsse, Stefan
 
Hallo Stefan,

das ist dann wirklich komisch. Mein (erwartetes) eingetretenes Ergebnis mit exakt dem gleichen Code:

Code:
cat test.txt
   Niederrhein, Ruhr, Münsterland
   3-Tagesprognose    Tagestemperaturen
   Samstag 08.12.2007 5° bis 7°C        bedeckt      [pc_5.gif] 15 %
   Sonntag 09.12.2007 7° bis 9°C        Regenschauer [pc_6.gif] 30 %
   Montag  10.12.2007 5° bis 6°C        Regen        [pc_7.gif] 80 %

Was passiert ohne die Umleitung von stdout in ein file ?
Bzw. die blödeste aller Fehlerquellen: Ist die Datei writeable (das Verzeichnis muss es ja sein, Du hast ja ein leeres File?

Gruß Olaf
 
@Stefan; die Kodierung der Umlaute in den Mustern bei sed muss zu der Kodierung passen, die Lynx ausgibt. Weil ich meine Skripte in UTF-8 schreibe, habe ich oben das "-display_charset=utf-8" eingefügt.

Bei dir dürfte es in der Ausgabe von Lynx keine Zeile geben, in der das "Münsterland" in der Kodierung vorkommt, die in deinem Skript steht. Deswegen ist die Ausgabe von sed leer.

Andreas
 
Buehmann, Du hattest Recht, das charset war es.

Nehme ich es raus bekomme ich eine feine Ausgabe.

Super und Vielen Dank euch beiden. Super Hilfe !

:groesste:

Wie gesagt - wenn jemand vor ähnlichen Problemen stehen sollte darf er diese mundgerechte Lösung auch gerne von mir komplett abgreifen..

Ich wünsch euch einen ruhigen Sonntag Abend.

Grüsse, Stefan
 

Neueste Beiträge

Statistik des Forums

Themen
244,858
Beiträge
2,219,653
Mitglieder
371,572
Neuestes Mitglied
#Kuddel#
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.