Leseratte10
Anmeldungsdatum: 10. August 2013
Beiträge: 104
|
Hallo, ich möchte mit SED aus einem HTML-String einen bestimmten Teil extrahieren. Hier mal ein Beispielstring: <div id='test'>testwert<b>1</b>2<i>3</i></div><div id='test123'>test123</div> Ich benutze folgenden String für SED: s/.*<div\ id='test'>\(.*\)<\/div>.*/\1/ Ich möchte einfach nur die Ausgabe "testwert<b>1</b>2<i>3</i>" haben - alles, was sich im div "test" befindet. Ich erhalte aber alles vom ersten bis zum letzten "div" - also "testwert<b>1</b>2<i>3</i></div><div id='test123'>test123". Wie kann ich bei SED angeben, dass er beim ersten Auftreten des Zielwerts abbricht? leseratte10
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Leseratte10 schrieb:
Wie kann ich bei SED angeben, dass er beim ersten Auftreten des Zielwerts abbricht?
Das tut er ja. Aber man muss verstehen, wie das Matching passiert: sed ist greedy, d.h. der Match geht so lange es geht. Durch den Teil ".*" in der Mitte weist Du ihn an alles zu matchen - damit geht dann der Match vom ersten "<div>" bis zum letzten "</div>". Das ist ganz normal. Ich sehe gerade mit sed keine gute Lösung, denn sed hat meines Wissens keinen Support für den "Reluctant Quantifier" ".*?". Das liegt daran, dass die Engine in sed ein DFA ist. Die beste Wahl wäre xmlstarlet oder ein anderes Tool, das für die Verarbeitung von Tagsprachen ausgelegt ist.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Beispiele $ echo '<r><div id='\''test'\''>testwert<b>1</b>2<i>3</i></div><div id='\''test123'\''>test123</div><t sel -t -c '//div[@id="test"]' -
<div id="test">testwert<b>1</b>2<i>3</i></div>
$ echo '<r><div id='\''test'\''>testwert<b>1</b>2<i>3</i></div><div id='\''test123'\''>test123</div></r>' | xmlstarlet sel -t -v '//div[@id="test"]' -
testwert123
$ echo '<r><div id='\''test'\''>testwert<b>1</b>2<i>3</i></div><div id='\''test123'\''>test123</div></r>' t sel -t -v '//div[@id="test"]//*' -
1
|
Leseratte10
(Themenstarter)
Anmeldungsdatum: 10. August 2013
Beiträge: 104
|
Ich habe xmlstarlet mal ausprobiert, mit dem Beispielcode von mir funktioniert das auch. Der wirkliche Code ist aber um einiges komplizierter, und es erscheinen jede Menge Fehler in der Ausgabe... Das Tool scheint nicht damit zurechtzukommen, dass in der HTML-Datei auch Javascript-Teile vorkommen (die aber ignoriert werden können).
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Leseratte10 schrieb: Ich habe xmlstarlet mal ausprobiert, mit dem Beispielcode von mir funktioniert das auch. Der wirkliche Code ist aber um einiges komplizierter, und es erscheinen jede Menge Fehler in der Ausgabe...
Kannst Du sie beheben?
Das Tool scheint nicht damit zurechtzukommen, dass in der HTML-Datei auch Javascript-Teile vorkommen (die aber ignoriert werden können).
Das ist durchaus möglich. Ich weiß nicht, was für eine Art Programm Du schreiben willst. Ich nehme für Skripte immer Ruby + Nokogiri. Das ist ein Parser, der auch HTML lesen kann selbst, wenn es nicht well formed ist.
|
Leseratte10
(Themenstarter)
Anmeldungsdatum: 10. August 2013
Beiträge: 104
|
Wie "beheben"? Der HTML-Code kommt von einer Webseite - da kann ich nicht erstmal den kompletten HTML-Code reparieren bevor ich ihn durch ein Script jage. Ich möchte einfach nur ein Bash-Script schreiben was zu einer bestimmten Webseite navigiert und bestimmte Teile von der Webseite als Text in der Konsole ausgibt.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
Leseratte10 schrieb: Wie "beheben"? Der HTML-Code kommt von einer Webseite - da kann ich nicht erstmal den kompletten HTML-Code reparieren bevor ich ihn durch ein Script jage.
Du hast ja nicht geschrieben, was für Fehlermeldungen das sind. Die könnten ja auch von der Nutzung von xmlstarlet her kommen.
Ich möchte einfach nur ein Bash-Script schreiben was zu einer bestimmten Webseite navigiert und bestimmte Teile von der Webseite als Text in der Konsole ausgibt.
Meine 0,02 EUR: nimm Ruby + Mechanize. Dann hast Du alles in einem inklusive Verwaltung von Session-Cookies etc. Eine Lösung in der bash ist mir noch für Dein Problem eingefallen: Du kannst Newlines vor jedem <div> einfügen: $ echo '<div id='\''test'\''>testwert<b>1</b>2<i>3</i></div><div id='\''test123'\''>test123</div>' \
| sed -r 's#<div#\n&#g' \
| sed -nr 's#^.*<div +id='\'test\''>(.*)</div.*$#\1#p'
testwert<b>1</b>2<i>3</i> Ciao robert
|
microft
Anmeldungsdatum: 6. August 2009
Beiträge: 454
Wohnort: Norddeutschland
|
Das ist ein Verhaltensmuster von regular exp. Such mal unter dem Stichwort "gierig" um dieses Verhalten zu beeinflussen. cu
|
Acer54
Anmeldungsdatum: 6. Juli 2011
Beiträge: 700
Wohnort: Bayern
|
wenn es nicht unbedingt Bash sein muss, könnte man auch Pyton verplichten (z.B. mit BeatifulSoup). Ich habe das z.Z. im Einsatz um mich duch dasoertliche.de zu navigieren und Suchergebnisse ab zu fragen... (CSV Datei auslesen → suche nach Name, reverse-Suche nach Telefonnumer → Ergebnisse incl. Adresse in CSV Datei updaten) Soll quasi eine Art Updater für Thunderbird werden... (telefonbuch automatisch aktualisieren, vervollständigen)
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
microft schrieb: Das ist ein Verhaltensmuster von regular exp. Such mal unter dem Stichwort "gierig" um dieses Verhalten zu beeinflussen.
Geht nicht bei sed (s.o.).
|
microft
Anmeldungsdatum: 6. August 2009
Beiträge: 454
Wohnort: Norddeutschland
|
rklm schrieb: microft schrieb: Das ist ein Verhaltensmuster von regular exp. Such mal unter dem Stichwort "gierig" um dieses Verhalten zu beeinflussen.
Geht nicht bei sed (s.o.).
Werf mal nen Blick auf den RegExp Syntax von sed, normalerweise gibts da irgend ein "\xxx" der das regelt. cu
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
microft schrieb: rklm schrieb: microft schrieb: Das ist ein Verhaltensmuster von regular exp. Such mal unter dem Stichwort "gierig" um dieses Verhalten zu beeinflussen.
Geht nicht bei sed (s.o.).
Werf mal nen Blick auf den RegExp Syntax von sed, normalerweise gibts da irgend ein "\xxx" der das regelt.
Nein. Du hast behauptet, dass es geht. Also bist Du auch in der Pflicht das nachzuweisen. Du hast ja noch nicht mal ein Argument geliefert, warum es gehen sollte, obwohl sed einen DFA nutzt. Ich empfehle Mastering Regular Expressions zu lesen.
|
microft
Anmeldungsdatum: 6. August 2009
Beiträge: 454
Wohnort: Norddeutschland
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12829
|
|