RE: Elemente aus HTML-Datei herausfiltern
Hi, was ist mit flex ? oder ist das zu umstaendlich ? -----Original Message----- From: Werner Schalk [mailto:werner_schalk@gmx.de] Sent: Donnerstag, 20. Februar 2003 18:14 To: suse-programming@suse.com Subject: Elemente aus HTML-Datei herausfiltern Hallo, ich sitze schon seit einigen Stunden an einem dummen Problem und kriege es trotz zahlreicher Versuche mit sed, awk und grep nicht gelöst. Ich habe eine .html-Datei, in der mehrfach u.a. folgende Zeichenkette auftaucht (in einer Zeile): Kategorie: 4.20 - 4.25<br>Beschreibung: <B>Kurzbeschreibung</B>Langbeschreibung<br> So jetzt möchte ich gerne alle Werte für die Kategorienummern (hier: 4.20 - 4.25) und deren Kurz- und Langbeschreibung aus dieser Datei extrahieren. Wie mache ich das am besten? Ich habe es mit grep, sed etc. probiert, aber es hat leider nicht geklappt. Mein Problem dabei ist, daß die .html-Datei ziemlich durcheinander ist und ich wirklich nur dieses kurze Textstück brauche, wobei es mehrfach vorkommt. Jemand ne Idee? Auch Perl ist gerne willkommen :-) Vielen Dank und schöne Grüße, Werner. -- Um die Liste abzubestellen, schicken Sie eine Mail an: suse-programming-unsubscribe@suse.com Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-programming-help@suse.com
Hi, On Fri, 21 Feb 2003, Schalk, Werner wrote:
Ich habe eine .html-Datei, in der mehrfach u.a. folgende Zeichenkette auftaucht (in einer Zeile):
in einer Zeile, und sie sieht immer wie das Beispiel aus, ja?
Kategorie: 4.20 - 4.25<br>Beschreibung: <B>Kurzbeschreibung</B>Langbeschreibung<br>
So jetzt möchte ich gerne alle Werte für die Kategorienummern (hier: 4.20 - 4.25) und deren Kurz- und Langbeschreibung aus dieser Datei extrahieren.
Was heisst extrahieren? Willst du alle drei Dinge z.B. durch einen ':' getrennt ausgeben? Oder wie? Das hat wesentlichen Einfluss darauf, wie du es machen musst, und ob sed praktikabel ist. Ich nehme mal fuers Demonstrieren an, das du genau das mit Extrahieren meinst, dann geht's so: % cat bla.html Was anderes. <kjnsdc></cskjnkscjdc> Kategorie: 4.20 - 4.25<br>Beschreibung: <B>Kurz1</B>Langbesch re 1<br> Kategorie: 5.20 - 4.25<br>Beschreibung: <B>Kurz2</B>La ngbeschre 2<br> Kategorie: 6.20 - 3.25<br>Beschreibung: <B>Kurz3</B>Langb eschre 3<br> Kategorie: 7.20 - 4.25<br>Beschreibung: <B>Kurz4</B>Langbeschr e 4<br> Kategorie: 8.20 - 8.25<br>Beschreibung: <B>Kurz5</B>Lang beschre 5<br> <blubba> dingdong </trallala> % sed -ne 's@^Kategorie: \([^<]*\)<br>Beschreibung: <B>\([^<]*\)</B>\([^<]*\)<br>.*$@\1:\2:\3@p' < bla.html 4.20 - 4.25:Kurz1:Langbesch re 1 5.20 - 4.25:Kurz2:La ngbeschre 2 6.20 - 3.25:Kurz3:Langb eschre 3 7.20 - 4.25:Kurz4:Langbeschr e 4 8.20 - 8.25:Kurz5:Lang beschre 5 Das sed-Kommando oben gehoert in eine Zeile, ansonsten musst du an den richtigen Stellen quotes einfuegen. Ciao, Micha.
Hallo Michael, vielen Dank für deine Antwort. Es funktioniert, aber ich muss noch folgende Angaben machen: Der Suchstring (Kategorie, Beschreibung, Kurz, Lang) steht in einer Zeile mit weiteren HTML-Befehlen, er leitet also nicht die Zeile ein. Ein Beispiel (Alle Kategorien, Beschreibungen, Kurz- und Langtexte stehen alle in einer Zeile, inkl. HTML-Code): ndeneve<h1>vfepo<a href>vbdsdsvsvsbvv>Kategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>blafaselsa<Hr>svsvblablablubbsbvv>Kategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>dsdsvsvsbvv> <br>wjfjwbfsp ncdende<h1> nevevfepovbe evbeovebveovbeove Dein Beispiel funktioniert schon, ich habe das "^"-Zeichen herausgenommen, da die Zeile ja nicht von meinem Suchstring eingeleitet wird: sed -ne 's@Kategorie: \([^<]*\)<br>Beschreibung: <B>\([^<]*\)</B>\([^<]*\)<br>.*$@\1:\2:\3@p' Aber es liefert mir nicht Vorkommen meines Suchstringes und leider noch jede Menge andere Daten, die ich eigentlich nicht brauche (HTML-Müll). Kannst Du mir nochmal helfen? Vielen Dank und schönen Gruß, Werner.
Hi, On Fri, 21 Feb 2003, Werner Schalk wrote:
Der Suchstring (Kategorie, Beschreibung, Kurz, Lang) steht in einer Zeile mit weiteren HTML-Befehlen, er leitet also nicht die Zeile ein. Ein Beispiel (Alle Kategorien, Beschreibungen, Kurz- und Langtexte stehen alle in einer Zeile, inkl. HTML-Code):
Ohh, d.h., das pro Zeile mehr als eine Kategorie vorkommen kann? Aber es ist wenigstens so, dass Kategorie+Kurz+Lang _nicht_ ueber mehrere Zeilen verteilt sind, ja?
ndeneve<h1>vfepo<a href>vbdsdsvsvsbvv>Kategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>blafaselsa<Hr>svsvblablablubbsbvv>Kategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>dsdsvsvsbvv> <br>wjfjwbfsp ncdende<h1> nevevfepovbe evbeovebveovbeove
Dein Beispiel funktioniert schon, ich habe das "^"-Zeichen herausgenommen, da die Zeile ja nicht von meinem Suchstring eingeleitet wird: sed -ne 's@Kategorie: \([^<]*\)<br>Beschreibung: <B>\([^<]*\)</B>\([^<]*\)<br>.*$@\1:\2:\3@p'
Also in dem Fall wuerde ich zweiteilen: Zuerst mal sicherstellen, das pro Kategorie eine Zeile, und dann das Aufteilen der Werte. Also % cat bla.html | sed -e 's/Kategorie:/\nKategorie:/g' | \ sed -ne 's@^.*Kategorie: \([^<]*\)<br>Beschreibung: <B>\([^<]*\)</B>\([^<]*\)<br>.*$@\1:\2:\3@p' Ciao, Micha.
Hallo Michael, die einzelnen Suchstrings (Kategorie, Beschreibung etc.) stehen alle in einer langen Zeile aus HTML-Code (nicht von mir so produziert). Wenn ich dein Beispiel auf folgenden Text anwende, findet der nix: ----Beispieltext---- ndeneve<h1>vfepo<a href>vbdsdsvsvsbvv>Kategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>blafaselsa<Hr>sblablablablubbvsvsbvv>Kategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>dsdsvsvsbvv> <br>wjfjwbfsp ncdende<h1>nevevfepovbe evbeovebveovbeovencdende ----Beispieltext---- Zumal ein Zeilenumbruch (\n) doch in sed durch "\\\n" gekennzeichnet werden sollte, oder? Ich habe folgendes probiert: $ cat bla | sed -e 's/Kategorie:/\nKategorie:/g' | sed -ne 's@^.*Kategorie: \([^<]*\)<br>Beschreibung: <B>\([^<]*\)</B>\([^<]*\)<br>.*$@\1:\2:\3@p' cat bla | sed -e 's/Kategorie:/\\\nKategorie:/g' Die Datei bla enthält den o.g. Beispieltext und ich habe diese Datei der E-Mail als Anhang beigefügt. Das Beispiel erzeugt ohne den zweiten sed-Befehl folgenden Output: $ cat bla | sed -e 's/Kategorie:/\nKategorie:/g' ndeneve<h1>vfepo<a href>vbdsdsvsvsbvv>nKategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>blafaselsa<Hr>sblablablablubbvsvsbvv>nKategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>dsdsvsvsbvv> <br>wjfjwbfsp ncdende<h1>nevevfepovbe evbeovebveovbeovencdende Hier ist doch "nKategorie" falsch, oder? Ich habe den Ausdruck "cat bla | sed -e 's/Kategorie:/\\\nKategorie:/g'" versucht, der meiner Meinung nach "\nKategorie" richtigerweise erzeugt, aber umgebrochen wird das in der Shell direkt leider nicht. Irgendwie ist hier heute der Wurm drin, dieses Problem beschäftigt mich schon fast zwei Tage :-( Vielen Dank für deine Hilfe, vielleicht schaffe ich es noch mit deiner Hilfe vor dem Wochenende :-) Viele Grüße, Werner.
Hi, On Fri, 21 Feb 2003, Werner Schalk wrote:
----Beispieltext----
ndeneve<h1>vfepo<a href>vbdsdsvsvsbvv>Kategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>blafaselsa<Hr>sblablablablubbvsvsbvv>Kategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>dsdsvsvsbvv> <br>wjfjwbfsp ncdende<h1>nevevfepovbe evbeovebveovbeovencdende
Das ist nicht das, was du das erste mal schriebst. Hier ist ein " " zwischen "<br>" und "Beschreibung", nicht aber zwischen "Beschreibung" und "<B>". Dann musst du natuerlich die Expression anpassen.
Zumal ein Zeilenumbruch (\n) doch in sed durch "\\\n" gekennzeichnet werden sollte, oder?
Ergs. Du hast ein altes sed. Da musst du anstatt dessen sowas machen: % cat bla | sed -e 'Kategorie:/\ Kategorie:/g' Man beachte, das hier tatsache ein echter Zeilenumbruch mitten im String ist, nach dem \ .
Ich habe folgendes probiert:
$ cat bla | sed -e 's/Kategorie:/\nKategorie:/g' | sed -ne 's@^.*Kategorie: \([^<]*\)<br>Beschreibung: <B>\([^<]*\)</B>\([^<]*\)<br>.*$@\1:\2:\3@p' ^^^ ^^^^
Siehst du? Das matcht natuerlich nicht auf dein Beispiel.
cat bla | sed -e 's/Kategorie:/\\\nKategorie:/g' ^^^^^ Nee, mit deinem sed geht das so nicht. Du brauchst ein inline-newline.
Die Datei bla enthält den o.g. Beispieltext und ich habe diese Datei der E-Mail als Anhang beigefügt.
Dein Datei als bla, ergibt: % cat bla | sed -e 's/Kategorie:/\ Kategorie:/g' ndeneve<h1>vfepo<a href>vbdsdsvsvsbvv> Kategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>blafaselsa<Hr>sblablablablubbvsvsbvv> Kategorie: 4.20 - 4.25<br> Beschreibung:<B>Computer & Hardware </B>Computerteile aller Art<br>wjfjwbfsp<hr>dsdsvsvsbvv> <br>wjfjwbfsp ncdende<h1>nevevfepovbe evbeovebveovbeovencdende Dann noch die angepasste zweite sed-expression drauf: sed -ne 's@^.*Kategorie: \([^<]*\)<br> Beschreibung:<B>\([^<]*\)</B>\([^<]*\)<br>.*$@\1:\2:\3@p' und es kommt raus: 4.20 - 4.25:Computer & Hardware :Computerteile aller Art 4.20 - 4.25:Computer & Hardware :Computerteile aller Art Ciao, Micha.
Hallo Michael, interessanterweise kommt bei der Datei bla, die ich Dir gerade geschickt habe, bei mir nur ein Ergebnis. Erhälst Du mit deinem sed-Befehl zwei? Ich habe den Befehl einfach per Copy & Paste in die Shell kopiert und folgendes gemacht (eine Zeile!): cat bla | sed -ne 's@^.*Kategorie: \([^<]*\)<br> Beschreibung:<B>\([^<]*\)</B>\([^<]*\)<br>.*$@\1:\2:\3@p' Ergibt bei mir: 4.20 - 4.25:Computer & Hardware :Computerteile aller Art Also nur ein Ergebnis! In der Datei bla standen jedoch zwei Beispiele soweit ich weiß? Woran könnte das liegen, alte sed-Version (3.0.2)? Viele Grüße, Werner.
Hi, On Fri, 21 Feb 2003, Werner Schalk wrote:
interessanterweise kommt bei der Datei bla, die ich Dir gerade geschickt habe, bei mir nur ein Ergebnis. Erhälst Du mit deinem sed-Befehl zwei? Ich habe den Befehl einfach per Copy & Paste in die Shell kopiert und folgendes gemacht (eine Zeile!):
cat bla | sed -ne 's@^.*Kategorie: \([^<]*\)<br> Beschreibung:<B>\([^<]*\)</B>\([^<]*\)<br>.*$@\1:\2:\3@p'
Ehh? Du hast ja wieder das Aufspalten der Zeilen vergessen (der erste sed-Aufruf, mit dem inline-newline). Ciao, Micha.
Hallo Reiner, vielen Dank für deine Hilfe. Leider habe ich noch nie mit Flex gearbeitet, hast Du entsprechende Beispiele? Viele Grüße, Werner.
participants (3)
-
Michael Matz
-
Rinke, Reiner
-
Werner Schalk