![]() |
(angezeigten) Text einer HTML-Quelle ermitteln
Salut.
Wie kann ich aus HTML-Quelltext den Text herausfiltern, den ich mit Ctrl-A im Browser selektieren würde? Sieht der HTML-Quelltext z.B. so aus:
XML-Code:
Dann würde ich gern folgenden Text haben wollen:
<html>
<head> ... </head> <body> <h3>Überschrift</h3> Hallo Welt!</p> <body> </html>
Code:
Das entspricht einem Ctrl-A, Ctrl-C im Browser und Ctrl-V im Editor.
Überschrift
Hallo Welt! Wie kann ich den gleichen Ergebnistext mit Delphi ermitteln? Ich habe bei den Delphi-Komponenten keine Eigenschaft Text oder ähnlich gefungen... MfG Panthrax |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Alle "<" und ">" suchen, das dazwischen mit den "<>" löschen, und aus "
" einen zeilenumbruch machen. Wobei dann aber nicht zwischen GROßEN und kleinen Texten unterschieden wird. |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Danke für deine Antwort.
...aber die Lösung ist zu propitär. Sie berücksichtigt nicht, dass es Tags gibt die Text umschließen, der nicht angezeigt wird; Beispiele: Title, Script, Style, Frame, IFrame,... MfG Panthrax |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Hallo Panthrax,
versuche es mal so:
Delphi-Quellcode:
Grüße vom marabu
uses
MSHTML; var doc: IHTMLDocument2; begin doc := WebBrowser.Document as IHTMLDocument2; ShowMessage(doc.body.innerText); end; |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Wenn du es ohne die IE-Objekte machen willst, blieben da noch PCRE (Reguläre Ausdrücke). In der JCL gibt es dazu ein Beispiel. Ansonsten TPerlRegEx von
![]()
Code:
...
s/<(?:.??)>//gism
|
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Hallo.
@marabu: Deine Lösung finde ich genau richtig. Leider löst jeder Zugriff auf das Interface Doc (Typ IHTMLDocument2) eine AV aus. Habe es auch mit Doc.title probiert - ebenfalls eine AV. Die Unit MSHTML kannte ich bis eben nicht. Da das Neuland für mich ist muss ich nochmal fragen, woran könnte es liegen, es das zugehörige Objekt WebBrowser1.Document (= nil) nicht gibt? [Edit]WebBrowser1.Navigate('http://abc.de'); wurde ausgeführt.[/Edit] @Olli: Danke für den Hinweis. Reguläre Ausdrücke könnte ich mir noch vorstellen. Obwohl dabei wieder das berücksichtigt werden müsste, was ich oben erwähnte. MfG Panthrax |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Ich glaube in dem Interface war ein Fehler (bzw. in der Unit). Ich melde mich nochmal, wenn ich mein Mailarchiv durchsucht habe.
|
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Panthrax, du schreibst du hättest das betreffende HTML-Dokument geladen. Wenn WebBrowser.Document nil ist, dann scheint mir der Ladevorgang zu dem Zeitpunkt noch nicht beendet zu sein, zu dem du deinen Zugriff machst. Hinweise darauf, wie du den richtigen Zeitpunkt abpassen kannst, erhältst du
![]() marabu |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Sorry, auch wenn ich noch nicht so alt bin hat mich meine Erinnerung getäuscht. Was ich meinte war das IDocHostUIHandler-Interface :-\
|
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Olli, dass mit dem faulty memory recall wird immer schlimmer - nicht nur bei dir. Ich dachte früher, ich werde alt, aber heute weiß ich woran es liegt: information overload! Die armen Synapsen...
Heitere Grüße vom marabu |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Zitat:
<Ausrede>IDocHostUIHandler hängt ja irgendwie mit IWebBrowser2 zusammen :zwinker:</Ausrede> |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Salut ihr beiden.
Ich habe folgendes probiert:
@marabu: Ergebnis: Richtig vermutet! Direkt nach dem Navigate ist es zufrüh nach dem WebBrowser1.Document zu fragen. Ich habe deshalb erst bei OnDocumentComplete mit Document gearbeitet. Funktioniert prima! Ich kann auf Doc.title, Doc.body.innerText,... zugreifen. Danke! :thumb: Un das mit dem mehrfachen Auslösen bei mehreren Frames ist auch gut. Das Verhalten kommt mir entgegen. Schade für mich: innerText gibt nicht den Text zurück, den ich mir erhofft hatte. :| Es sind noch alle HTML-Tags enthalten. Scheint also so, als müsste ich die HTML-Tags doch noch selbst entfernen; entweder durch reguläre Ausdrücke oder durch den Dokumentbaum hangeln. Wo wir schon fast dabei sind: Gibt es eine Komponente die durch HTML-Tags eines Dokuments iteriert? Oder kann man sich bei TWebBrowser beim erstellen des Dokuments einklinken, so dass man die Tags mitbekommt? @Olli: Jeder kann sich mal irren... Auf jeden Fall: Danke für die Hilfe! :thumb: Auf reguläre Ausdrücke werde ich ganz bestmmt noch einmal zurückkommen. Ich kenne sie aus PHP und finde sie sehr bequem. Habe ich in Delphi vermisst als ich sie kennengelernt habe. MfG Panthrax |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Neunis Lösung ist doch super. Was habt ihr denn daran auszusetzen? Einfach erstmal die Zeilenumbrüche (#13#10 erstzen durch '' und danach <br*> ersetzen durch #13#10) dann ein stringgreplace, welches Wildcards kann und dann '<*>' durch '' ersetzen und dann noch die htmlspecialchars und schon perfekt.
|
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Den Link hab ich im I-Net gefunden. Kannste dir ja mal anschauen und entsprechend verändern.
![]() MfG, St.Pauli |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Hallo Panthrax,
Zitat:
Bei komplexen Dokumenten verwende ich gelegentlich den von dir erwähnten iterativen / rekursiven Ansatz über die property children. Auch das ist keine Universallösung. marabu |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Wenn du wohlgeformtes XHTML verwendest, kannst du einen XML-Parser nehmen und beispielsweise via XPATH alle Elemente, die Text enthalten, ermitteln und deren Text extrahieren.
|
Re: (angezeigten) Text einer HTML-Quelle ermitteln
@marabu:
Ui. Es war gestern wahrscheinlich doch schon etwas spät... Hatte wirklich innerHTML, und nicht innerText verwendet. :oops: Ich habe es korrigiert - und auch kein HTML mehr. :angel2: Danke. Was ich noch nicht gefunden habe ist der Hinweis auf die CSS-Datei bzw. die verwendeten StyleSheets. In dem Zusammenhang interessiert mich auch woher bekomme ich die Standardeinstellungen der Elementdarstellungen? Denn mit CSS werden diese Darstellungen ja modifiziert. Da MSHTML nicht in der Hilfe Dokumentiert ist (Ich finde jedenfalls keinen Hilfeeintrag dazu; bleibt wohl nur die MS-Webseite als Referenz.), habe ich mir TXMLDocument noch einmal genauer angesehen. Also es ist ja schon nicht schlecht mit IXMLNode durch die einzelnen Elemente navigieren zu können, und ihre Attribute und Inhalte lesen zu können. Aber mit TXMLDocument funktioniert das ja nur, wenn das Dokument wohlgeformt ist. @Chewie: Danke für den Hinweis, aber was ist XPath? :gruebel: Hab mich mal in der Komponentenpalette umgeschaut. Aber irgendwie findet sich dort kein Parser oder eine Komponente die man dazu misbrauchen könnte. Hat jemand empfehlungen? Wo wir schon dabei sind: gibt es auch Parser für CSS-Dateien? Gruß Panthrax |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
XPath:
![]() Es ist im Wesentlichen eine Sprache zum Adressieren von Knoten eines XML-Dokumentes. Und als Parser könntest du z.B. MSXML einsetzen. |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
XPath hab ich verstanden. Für die Mitlesenden: Ich habe meine Informationen im wesentlichen hier gefunden:
![]() ![]() Als ich Parser meinte, hatte ich eher an eine Komponente gedacht, die man mit einem Parser wie "MSXML" verwendet (etwa wie bei TXMLDocument). Also eine Komponente, die, wenn sie auf ein Tag trifft ein Ereignis auslöst, bei dem ich mich einklinken kann. Etwa so wie dies bei TPageProducer der falls ist: Parst eine Vorlage um die Ausgabe zu generieren und löst ein Ereignis OnHTMLTag aus. Gibt es soetwas auch für zu parsende HTML/XML-Dateien? Panthrax |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Hallo Panthrax,
es gibt zwei grundverschiedene Ansätze für das Parsen von XML (und auch generell). Beim einen (IXMLDOMDocument) baut der Parser eine in-memory Struktur auf, die das untersuchte Dokument repräsentiert, beim anderen (ISAXXMLReader) werden Ereignisse ausgelöst, auf die du reagieren kannst. Du solltest dir den Microsoft Platform SDK besorgen, der all diese Systemkomponenten dokumentiert. Auch Tutorials und sample code ist dabei. Unverzichtbar. marabu |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Zitat:
Hast Du evtl. nen Link? Thx |
Re: (angezeigten) Text einer HTML-Quelle ermitteln
Ist schon OK - du holst dir immer den aktuellen PSDK.
marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz