Textknoten aus HTML rippen (HTML2TXT)
Christoph Zurnieden
- programmiertechnik
Hallo zusammen,
die Zeiten sind ja schon lange vorbei, da dieser kleine Codeschnippsel
if(*html == '<')
while(*html != '>') html++;
else putchar(*html);
für den Zweck der Textextraktion aus HTML wunderbar funktionierte, also stehe ich nun wohl vor einer etwas aufwendigeren Implementation. Kommentare lassen sich ja relativ leicht handeln, da zwischen "--" und "--", nur Javascript, wenn als Nachkomme des script-Elementes, macht da schwer Ärger. Immerhin wird, Standard hin oder her, von den Browsern alles geschluckt. Z.B. Dekrementierung (i--) auch wenn das Javascript in einem Kommentar steht; aber vor allem das '<', das escaped werden müßte, aber in Javascript nur extrem selten wird (ich tu's ja auch nicht immer, gebe ich ehrlich zu ;-).
Gilt "alles zwischen '<script' und '</script' ist Javascript" immer, auch wenn unkorrekterweise das '<' z.B. in
alert("hallo </script>");
nicht ordnungsgemäß escaped wurde? Die mir hier zur Verfügung stehenden Browser machen es so halbwegs richtig (Zeigen die drei Zeichen '");' an, was an der Stelle eigentlich nicht zulässig ist. Oder ist ein Textknoten zwischen </script> und </head> etwa erlaubt?) aber ich habe hier keinen Zugriff auf den IE und auch beim Opera fehlt mir der Überblick.
Wenn mir also jemand bezüglich dieser Wissenslücke behilflich sein könnte?
so short
Christoph Zurnieden
Hallo,
Immerhin wird, Standard hin oder her, von den Browsern alles geschluckt. Z.B. Dekrementierung (i--) auch wenn das Javascript in einem Kommentar steht; aber vor allem das '<', das escaped werden müßte, aber in Javascript nur extrem selten wird
Hm? »<« muss nicht maskiert werden. Lediglich »</« sollte nicht zwischen den script-Tags auftauchen, weil es zur Erkennung des End-Tags reserviert ist. Wenn ein »</« kommt, muss es Teil von »</script>« sein und das script-Element schließen. Andernfalls muss man »</« notieren, also z.B. document.write("<p>Hallo Welt</p>");.
Gilt "alles zwischen '<script' und '</script' ist Javascript" immer, auch wenn unkorrekterweise das '<' z.B. in
alert("hallo </script>");
nicht ordnungsgemäß escaped wurde?
Ja, andernfalls könnte man keinen sinnvollen Parser schreiben. Bei diesem End-Tag ist das script-Element definitiv zuende, das sollte jeder Browser so sehen, das ist auch so vorgeschrieben.
Die mir hier zur Verfügung stehenden Browser machen es so halbwegs richtig (Zeigen die drei Zeichen '");' an, was an der Stelle eigentlich nicht zulässig ist.
Oder ist ein Textknoten zwischen </script> und </head> etwa erlaubt?)
Das ist zwar nicht erlaubt, aber trotzdem zeigen die meisten Browser normale Zeichendaten direkt innerhalb von head an.
Mathias
Hallo,
Oder ist ein Textknoten zwischen </script> und </head> etwa erlaubt?)
Das ist zwar nicht erlaubt, aber trotzdem zeigen die meisten Browser normale Zeichendaten direkt innerhalb von head an.
In einigen HTML-Versionen ist es erlaubt, weil das HEAD- und BODY-Element optionale Start- und End-Tags haben. Das HEAD-Element ist dann eben beendet, wenn die ersten Zeichendaten auftauchen und BODY beginnt hier.
@Christoph: Willst Du wirklich noch einen HTML-Parser schreiben. Da gibt es doch sicherlich in allen OOP-Sprachen schon ausreichend fertige Klassen für.
viele Grüße
Axel
Hi,
@Christoph: Willst Du wirklich noch einen HTML-Parser schreiben. Da gibt es doch sicherlich in allen OOP-Sprachen schon ausreichend fertige Klassen für.
Nicht nur in OOP-Sprachen (meine drei Beispielzeilen sollten übrigens zu erkennen geben, das ich eh kein Freund sogenannter OOP-Sprachen bin ;-), aber hier geht es nur darum Textknoten rauszulösen. Den ganzen restlichen Kladderadatsch brauche ich nicht. Denn der bringt eine ungeheure Menge Komplexität mit in's Boot, mit unbekannten Seiteneffekten und unbekannten Fehlern. Wenn ich das gleiche Ziel mit einem knappem Dutzend Zeilen erreichen kann ist mir das lieber.
so short
Christoph Zurnieden
Hallo,
aber hier geht es nur darum Textknoten rauszulösen. Den ganzen restlichen Kladderadatsch brauche ich nicht. Denn der bringt eine ungeheure Menge Komplexität mit in's Boot, mit unbekannten Seiteneffekten und unbekannten Fehlern. Wenn ich das gleiche Ziel mit einem knappem Dutzend Zeilen erreichen kann ist mir das lieber.
Mit der allgemeinen Vorgabe "HTML", was zur Zeit von HTML3.x über HTML4.x bis zu XHTML1.1 alles bedeuten kann, glaube ich an diesen max.11-Zeiler erst, wenn ich ihn sehe ;-)).
Wenn Du natürlich weitere Vorgaben außer HTML machst, dann...
Bedenke, dass eie gültiges HTML4.01-Dokument so aussehen kann:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<title>Der Titel</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<h1>Überschrift</h1>
<p>Der erste Textabsatz ........
........ Ende erster Textabsatz.
<p>Der zweite Textabsatz ........
........ Ende zweiter Textabsatz.
viele Grüße
Axel
Hi,
Mit der allgemeinen Vorgabe "HTML", was zur Zeit von HTML3.x über HTML4.x bis zu XHTML1.1 alles bedeuten kann, glaube ich an diesen max.11-Zeiler erst, wenn ich ihn sehe ;-)).
11 Zeilen waren vielleicht etwas arg knapp bemessen ;-)
Aber ich gebe einen aus, wenn ich diese Vorgabe wirklich um mehr als 100% überschreite!
Bedenke, dass eie gültiges HTML4.01-Dokument so aussehen kann:
[...]
Da verstehe ich das Problem nicht.
so short
Christoph Zurnieden
Hi,
Mit der allgemeinen Vorgabe "HTML", was zur Zeit von HTML3.x über HTML4.x bis zu XHTML1.1 alles bedeuten kann, glaube ich an diesen max.11-Zeiler erst, wenn ich ihn sehe ;-)).
11 Zeilen waren vielleicht etwas arg knapp bemessen ;-)
Kommt drauf an, welche Programmiersprache Du benutzt. Die wenigsten haben eine Beschränkung der Zeilenlänge oder eine Beschränkung der Statements pro Zeile (weil sie Zeilenumbrüche ähnlich wie in HTML als eines von mehreren möglichen Whitespace-Zeichen ohne irgendeine Sonderbedeutung betrachten) ...
Ausnahmen wie lochkartenorientierte Sprachen (COBOL ...) wirst Du wohl kaum verwenden ...
cu,
Andreas
Hi,
Kommt drauf an, welche Programmiersprache Du benutzt. Die wenigsten haben eine Beschränkung der Zeilenlänge oder eine Beschränkung der Statements pro Zeile (weil sie Zeilenumbrüche ähnlich wie in HTML als eines von mehreren möglichen Whitespace-Zeichen ohne irgendeine Sonderbedeutung betrachten) ...
Du möchtest mir also schon im Vornherein Betrugsabsichten unterstellen? ;-)
Ausnahmen wie lochkartenorientierte Sprachen (COBOL ...) wirst Du wohl kaum verwenden ...
Bring mich besser nicht auf krumme Ideen! >;->
so short
Christoph Zurnieden
Moin,
Bedenke, dass eie gültiges HTML4.01-Dokument so aussehen kann:
Achwas, harmlos. _Das_ hier ist mal ein gültiges Dokument in 4.01 strict:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>bla</title>
<script type="text/javascript">alert("")</>
<p/foo/
(so nebenbei mal testen ob das code-Highlighting damit klarkommt ;)
Der einzige Textknoten den ein Browser darstellen sollte ist übrigens foo.
Hi,
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>bla</title>
<script type="text/javascript">alert("")</>
<p/foo/
> Der einzige Textknoten den ein Browser darstellen sollte ist übrigens foo.
Falsch, der Textknoten "bla" sollte auch dargestellt werden.
(ach ja, bei mir wird
<p/foo/
p/foo
im Posting dargestellt, in der Antwortbox ist aber nur
<p/foo/
zu sehen)
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://www.Mud-Guard.de/)
[Schreinerei Waechter](http://www.schreinerei-waechter.de/)
Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
Moin,
Falsch, der Textknoten "bla" sollte auch dargestellt werden.
Naja, etwas in die Titel/Fußzeile zu packen hatte ich jetzt nicht so unter darstellen verstanden. Es kommt jedenfalls nicht in den Textbereich.
(ach ja, bei mir wird
<p/foo/
p/foo
im Posting dargestellt, in der Antwortbox ist aber nur
<p/foo/
zu sehen)
Ja, das war ein Forumsbug den CK mittlerweile korrigiert hat. Jetzt wird 'nur' noch falsch gehighlighted ;-)
Hi,
Oder ist ein Textknoten zwischen </script> und </head> etwa erlaubt?)
Das ist zwar nicht erlaubt, aber trotzdem zeigen die meisten Browser normale Zeichendaten direkt innerhalb von head an.
In einigen HTML-Versionen ist es erlaubt, weil das HEAD- und BODY-Element optionale Start- und End-Tags haben.
Nein, das ist nicht erlaubt.
Das HEAD-Element ist dann eben beendet, wenn die ersten Zeichendaten auftauchen und BODY beginnt hier.
Das ist zwar korrekt, aber das </head> steht damit im body, wo es nicht erlaubt ist.
cu,
Andreas
Hallo,
Das HEAD-Element ist dann eben beendet, wenn die ersten Zeichendaten auftauchen und BODY beginnt hier.
Das ist zwar korrekt, aber das </head> steht damit im body, wo es nicht erlaubt ist.
Ja, und der korrekte Parser bricht seine Arbeit genau _dann_ ab, so dass die Zeichendaten zwischen </script> und </head> angezeigt werden.
viele Grüße
Axel
Hi,
Hm? »<« muss nicht maskiert werden.
Naja, eigentlich schon, nur die Browser sehen das nicht so eng. Deshalb ja auch mein Problem.
Lediglich »</« sollte nicht zwischen den script-Tags auftauchen, weil es zur Erkennung des End-Tags reserviert ist. Wenn ein »</« kommt, muss es Teil von »</script>« sein und das script-Element schließen. Andernfalls muss man »</« notieren, also z.B. document.write("<p>Hallo Welt</p>");.
Ist Dir evt auch bekannt, ob und bis welche Version hinunter der IE und Opera sich daran halten? Teilantworten natürlich auch gern gesehen.
Ja, andernfalls könnte man keinen sinnvollen Parser schreiben.
Oh, klar könnte man! ;-)
Nur wäre man dann gezwungen auch einen Javascript-parser light mit einzubauen. Ziemlich blödsinnig, klar, aber bei manchen Software-Herstellern verlasse ich mich nicht darauf, sondern probiere sicherheitshalber >;->
so short
Christoph Zurnieden
Hallo,
Hm? »<« muss nicht maskiert werden.
Naja, eigentlich schon, nur die Browser sehen das nicht so eng. Deshalb ja auch mein Problem.
Nicht »eigentlich schon«, sondern einfach »nein«. HTML schreibt es so vor, dass »<« nicht maskiert werden muss. Wie sollte man es auch maskieren? »<« wäre ja Unsinn. Und »<« geht auch nicht: Zeichenreferenzen und Entity-Referenzen dürfen in script-Elementen gar nicht aufgelöst werden und müssen unangetastet im Textknoten verbleiben. Wenn ein Browser bei <script type="text/javascript">alert("<tag>");</script> »<tag>« ausgibt, ist er schlichtweg fehlerhaft. (XHTML ist eine andere Geschichte.)
Lediglich »</« sollte nicht zwischen den script-Tags auftauchen, weil es zur Erkennung des End-Tags reserviert ist. Wenn ein »</« kommt, muss es Teil von »</script>« sein und das script-Element schließen. Andernfalls muss man »</« notieren, also z.B. document.write("<p>Hallo Welt</p>");.
Ist Dir evt auch bekannt, ob und bis welche Version hinunter der IE und Opera sich daran halten? Teilantworten natürlich auch gern gesehen.
Inwiefern daran halten? Wenn ein »</script>« kommt, sollte jeder Browser, der JavaScript versteht, das script-Element schließen. Dass ein unmaskiertes »</« nur vor »script>« stehen darf, interessiert hingegen keinen Browser, die sind tolerant. Sie sehen über Fehler wie document.write("<p>Hallo Welt</p>"); hinweg und ignorieren den schließenden p-Tag. Das macht hier Opera ab Version 5.05 (Linux).
Mathias
Hi,
»»(XHTML ist eine andere Geschichte.)
Nein, der muß mit rein, ich kann keine Ausnahmen machen. da also der kleinste gemeinsame Nenner gilt ...
Ist Dir evt auch bekannt, ob und bis welche Version hinunter der IE und Opera sich daran halten? Teilantworten natürlich auch gern gesehen.
Inwiefern daran halten? Wenn ein »</script>« kommt, sollte jeder Browser, der JavaScript versteht, das script-Element schließen.
Nun, was die Browser sollten, was sie tun ist wichtig, denn wenn sie das akzeptieren wird das auch gemacht. Bevor ich micht jetzt aber durch Google wühle, um eine Statistik zu erstellen, ob das überhaupt gemacht wird und vor allem wie oft dachte ich mir: frag' einfach mal in die Runde.
Dass ein unmaskiertes »</« nur vor »script>« stehen darf, interessiert hingegen keinen Browser, die sind tolerant. Sie sehen über Fehler wie document.write("<p>Hallo Welt</p>"); hinweg und ignorieren den schließenden p-Tag. Das macht hier Opera ab Version 5.05 (Linux).
Ah gut. Wenn das einer so macht, dann reicht das als Argument, dann muß ich also komplett auf "</script" prüfen, ich danke allen Mitwirkenden.
Mühselig ernährt sich das Eichhörnchen ;-)
so short
Christoph Zurnieden
Hi,
die Zeiten sind ja schon lange vorbei, da dieser kleine Codeschnippsel
if(*html == '<')
while(*html != '>') html++;
else putchar(*html);
für den Zweck der Textextraktion aus HTML wunderbar funktionierte,
Hat er das jemals?
<body title="> blablubb" style="/*wasauchimmer*/">
ist vollkommen korrektes HTML. Ab dem zweiten Zeichen des title-Attributs würde der Text ausgegeben.
Und wenn man dann noch die ganzen SHORT_TAG Folgen bedenkt ...
cu,
Andreas
Hi,
Puh, ich hätte mir meine wortreiche Einleitung wohl besser sparen sollen ;-)
die Zeiten sind ja schon lange vorbei, da dieser kleine Codeschnippsel
if(*html == '<')
while(*html != '>') html++;
else putchar(*html);
für den Zweck der Textextraktion aus HTML wunderbar funktionierte,Hat er das jemals?
Nein, nie (oder evt bei HTML-0.9?), war rein rethorisch.
<body title="> blablubb" style="/*wasauchimmer*/">
ist vollkommen korrektes HTML.
Meiner Erinnerung nach hätten sich einige der _ganz_ frühen Browser an dem unmaskiertem '>' im Tag verschluckt. Aber das war noch vor Netscape-3, ist also nicht mehr wirklich relevant ;-)
Aber hast schon Recht, das hätte ich wahrscheinlich vergessen, danke.
Auha, das wird jetzt aber knapp, mit meinem 22-Zeiler ;-)
Und wenn man dann noch die ganzen SHORT_TAG Folgen bedenkt ...
Nein, das verstehe ich nicht, warum sollte es da nicht funktionieren? Vorrausgesetzt natürlich, da steht nichts "gefährliches" in den Attributen.
so short
Christoph Zurnieden
Hi,
Meiner Erinnerung nach hätten sich einige der _ganz_ frühen Browser an dem unmaskiertem '>' im Tag verschluckt. Aber das war noch vor Netscape-3, ist also nicht mehr wirklich relevant ;-)
Was Browser machen, ist doch hier nicht relevant. Relevant ist doch, was Dein Programm mit korrektem HTML macht ...
Und wenn man dann noch die ganzen SHORTTAG Folgen bedenkt ...
Nein, das verstehe ich nicht, warum sollte es da nicht funktionieren? Vorrausgesetzt natürlich, da steht nichts "gefährliches" in den Attributen.
Ich weiß ja nicht, was Du mit SHORTTAG verbindest (sorry, hatte es vorhin versehentlich mit _ geschrieben).
Schau Dir mal den Beispielcode in
http://forum.de.selfhtml.org/archiv/2004/3/t74651/#m432365
an - und dann überleg nochmal, ob es so einfach ist, den Parser zu schreiben, die > sind in HTML ja weitestgehend überflüssig.
cu,
Andreas
Hi,
Meiner Erinnerung nach hätten sich einige der _ganz_ frühen Browser an dem unmaskiertem '>' im Tag verschluckt. Aber das war noch vor Netscape-3, ist also nicht mehr wirklich relevant ;-)
Was Browser machen, ist doch hier nicht relevant. Relevant ist doch, was Dein Programm mit korrektem HTML macht ...
Leider reicht das nicht, da viele Browser auch inkorrektes HTML akzeptieren und deshalb auch viel inkorrektes HTML rumfliegt. Ich wollte mich ja eben _nicht_ nur auf korrektes HTML beschränken.
Ich weiß ja nicht, was Du mit SHORTTAG verbindest
Das Falsche, wie ich schon befürchtet hatte ;-)
Schau Dir mal den Beispielcode in
http://forum.de.selfhtml.org/archiv/2004/3/t74651/#m432365
an - und dann überleg nochmal, ob es so einfach ist, den Parser zu schreiben, die > sind in HTML ja weitestgehend überflüssig.
Ja, das hatte ich schon im Auge, aber eine kuze statistische Untersuchung bei Google hat ergeben das das ausreichend selten vorkommt. Wenn das doch zu oft Ärger macht, muß ich halt in den sauren Apfel beißen und die libwww o.ä. einbinden. Ist aber erstmal(!) akzeptabel.
Bei o.a. Beispiel zeigt der Mozilla (1.7a) übrigens nur die LIs an und zwar _nur_ die. Anzeige also:
1.
2.
3.
mehr nicht.
Netscape-4.79 mag's überhaupt nicht.
Tidy (4th August 2000) auch nicht.
so short
Christoph Zurnieden