Menedas
Anmeldungsdatum: 1. September 2005
Beiträge: 1119
|
Hin und wieder speichere ich Internetseiten in der Druckversion um sie in Zotero zu übernehmen. Dazu möchte ich diese htmls von bestimmten Tags wie <script ... /script> befreien, die sich über mehrere Zeilen erstrecken können. Bisher habe ich das einfach mit replace-regexp in emacs und <script.+</script> gemacht. Allerdings funktioniert das nur auf einer Zeile. Die sed Lösungen die ich dazu gefunden habe sind: Das löscht allerdings alle Tags. Ich habe es gestern aber leider auch nicht geschafft, das an meine Bedürfnisse anzupassen. | sed '/<script/,/<\/script>/d'
|
Das löscht zwar nur den von mir gewünschten Tag, allerdings wird die ganze Zeile entfernt, in der der Schlusstag steht. Das ist schlecht, da sich da zum Teil noch andere Sachen drin befinden können, die nicht weg sollen. Sorry, dass ich so unfähig bin und wieder eure Hilfe brauche 😳
|
königkarl
Anmeldungsdatum: 19. Oktober 2007
Beiträge: 100
|
Schau dir mal xmlstarlet aus den Standard-Paketquellen an. Eventuell kannst du mit diesem Kommandozeilen-Tool dein Problem lösen. http://www.ibm.com/developerworks/xml/library/x-starlet/index.html
|
Menedas
(Themenstarter)
Anmeldungsdatum: 1. September 2005
Beiträge: 1119
|
Wenns geht nur Standard GNU/bash Tools. Sonst wird das mit der Portabilität problematisch.
|
königkarl
Anmeldungsdatum: 19. Oktober 2007
Beiträge: 100
|
Reguläre Ausdrücke werden bei dieser Aufgabe aber früher oder später Probleme bekommen, da sie nicht mächtig genug sind, dir valide HTML zu bearbeiten. Nichtsdestotrotz, was hälst du von folgendem Ansatz: | sed -e 's/\(<script\)/\<!-- \1/'
sed -e 's/\(\/script>\)/\1 -->/'
|
Einfach die <script>-Tags durch Kommentaren umschließen?
|
Menedas
(Themenstarter)
Anmeldungsdatum: 1. September 2005
Beiträge: 1119
|
Ja, das wäre natürlich auch noch eine Idee ☺
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Nee, mit den zeilenorientierten Tools wie sed usw. brichst Du Dir was ab, wenn Du Tag-orientierte Sachen hast. (ich habe schon HTML-Seiten gesehen, die bestanden nur aus 1 Zeile Text, mit 200000 Zeichen) Sind die Seiten gewöhnliches HTML oder XHTML ? (was sagt die 1. Zeile des Seiten-Quelltexts dazu ?) Wenn es XHTML ist, dann ist es auch XML, und das geht wunderschön mit xmlstarlet. (bei dem alten HTML habe ich es noch nicht hinbekommen) Schau mal, ob Du in den älteren Beiträgen auf dem Forum schon etwas passendes findest: http://ubuntuusers.de/search/?query=track+xmlstarlet&area=forum&date_begin=&date_end=&sort=&forums=shell-und-programmieren Und sonst zeig mal ein Arbeitsbeispiel, dann können wir es praktisch ausprobieren. track
|
Menedas
(Themenstarter)
Anmeldungsdatum: 1. September 2005
Beiträge: 1119
|
Meines Wissens normales HTML. Muss ich grad mal schauen was sie sagt. | <!DOCTYPE html SYSTEM "about:legacy-compat">
|
Son merkwürdiges doctype hab ich auch noch nicht gesehen. Allerdings bin ich da auch schon ne Weile draußen. Mich hätte es trotzdem gewundert, wenn es XHTML gewesen wäre. Arbeitsbeispiel. Die ersten paar Zeilen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | <!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="de-de"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!--start: head-->
<!--start: headtitle-->
<title>Wirtschaftskreislauf: Das Kilo für 1,20 Dollar | Wirtschaft | ZEIT ONLINE</title>
<!--end: headtitle-->
<meta name="robots" content="noindex, follow">
<script type="text/javascript">
// <![CDATA[
window.zeitversion = 159;
window.js_path = "http://scripts.zeit.de/static/js";
window.css_path = "http://css.zeit.de/static/css";
window.www_root = "http://www.zeit.de";
// ]]>
</script><link rel="stylesheet" href="komplettansicht-Dateien/printview.css" type="text/css" media="all">
|
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Das könnte trotzdem XHTML sein ... Teste doch einfach, ob es gültiges XML ist:
xmlstarlet val [Name_der_HTML-Datei] Das ist das einfachste. Aber an Deinem Beispiel siehst Du schon, warum das mit zeilenorientierten Tools Murks ist: in der letzten Zeile stehen die Tags </script> und <link> ganz locker in der selben Zeile, obwohl sie nichts miteinander zu tun haben ... track
|
Menedas
(Themenstarter)
Anmeldungsdatum: 1. September 2005
Beiträge: 1119
|
Finde ich jetzt etwas bedenklich, dass man ein Programm braucht um das rauszufinden. Aber es sagt, dass es invalid ist.
|
königkarl
Anmeldungsdatum: 19. Oktober 2007
Beiträge: 100
|
Wenn nicht, die HTML-Datei vorher durch HTML Tidy jagen. Ich meine mich zu erinnern, dass das XHTML erzeugt. Menedas schrieb: Finde ich jetzt etwas bedenklich, dass man ein Programm braucht um das rauszufinden. Aber es sagt, dass es invalid ist.
Ich würde mir mehr sorgen um das HTML mit den regulären Ausdrücken machen. 😉
|
Menedas
(Themenstarter)
Anmeldungsdatum: 1. September 2005
Beiträge: 1119
|
königkarl schrieb: Ich würde mir mehr sorgen um das HTML mit den regulären Ausdrücken machen. 😉
😛 😉 Das wirkt jetzt alles sehr viel aufwendiger als ich gedacht hatte. Gerade was den Einsatz von "Spezial-Software" angeht. Gibts sonst echt keine "normale" andere Möglichkeit, z.b. über awk? EDIT:
Vergesst die letzte Frage wieder. track hat in einem andern Thread geschrieben, dass es nicht mit awk geht, da auch zeilenorientiert :/
|
königkarl
Anmeldungsdatum: 19. Oktober 2007
Beiträge: 100
|
Wenn du mit sed das gewünschte Ergebnis erzielst, dann würde ich es erst einmal so lassen. Du musst nur auf der Hut sein, dass du dir damit nicht die HTML-Datei zerstörst.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Menedas schrieb: Das wirkt jetzt alles sehr viel aufwendiger als ich gedacht hatte. Gerade was den Einsatz von "Spezial-Software" angeht.
XML ist gar nicht so "spezial", nur ungewohnt. Schließlich erledigt sonst immer der Browser den ganzen XML-Kram für Dich. 😉 EDIT: Vergesst die letzte Frage wieder. track hat in einem andern Thread geschrieben, dass es nicht mit awk geht, da auch zeilenorientiert :/
Na ja, es geht schon, nur macht es nicht wirklich Spaß, einen Parser damit zu bauen. Eben, weil die Tags sonstwie auf die Zeilen verteilt sein können. Und das musst Du bei den Zeilenorientierten alles selber abfangen ... (aber dazu hatte ich auch schon Beispiele hier geliefert: http://ubuntuusers.de/search/?query=track+awk+xml&area=forum&date_begin=&date_end=&sort=&forums=shell-und-programmieren ) Wenn Du einigermaßen "brave" Vorlagen hast, wird das mit solchen Tools schon erstmal gehen, solange sich die Zeilenaufteilung nicht zu sehr ändert. Da ist der Rat von königkarl schon ganz reell. track
|
Menedas
(Themenstarter)
Anmeldungsdatum: 1. September 2005
Beiträge: 1119
|
Als alternative Lösung hab ich auch das noch gesehen: ... | tr -d '\n' | sed 's/... Dann hat man das Problem nimmer ☺ Da sieht dann allerdings auch das HTML bescheiden aus.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Na, wenn Du unbedingt solche Tricks ziehen willst, dann kannst Du besser das < als Trennzeichen definieren:
awk 'BEGIN { RS="<"; ORS=RS } { ... }' Dann hast Du alle Tags als "Zeilenanfang" stehen. Ok, wenn außerhalb der Tags niemals das Zeichen < vorkommt ... Aber die Chance ist besser als bei einer rein zeilenorientierten Behandlung. Und, Du musst beim drucken etwas aufpassen, damit nicht am Dateiende ein einsames < steht. track
|