![]() |
Re: Position von Text/Links in einer HTML Datei finden
Hallo Hiele,
der Gira Home bzw. Facility Server liefert laut Hersteller Informationen über angeschlossene Installationen nicht nur als XHTML-Seite, sondern auch in einer Reihe von Formaten, die sich besser zur Weiterverarbeitung eignen, z.B. XML. Wäre das nicht ein Ansatz um an die Daten zu kommen? Ansonsten verstehe ich das von dir beschriebene Problem inzwischen so: Dein Programm soll das Auslesen von bestimmten Daten einer HTML-Seite ermöglichen, ohne dass der Benutzer den HTML-Quelltext analysieren muss. Nicht so klar ist mir die Rolle des Text-Parsers auf dem Gira Server. Wieso wird der überhaupt gebraucht? Ein eigenes Programm könnte die HTML-Seite im WebBrowser Control rendern und den gewünschten Text in vielen Fällen über einen Maus-Klick auswählen. Dazu muss über die IHTMLTxtRange-Schnittstelle das Element ermittelt werden, auf das mit der Maus geklickt wurde. Anschließend prüft man, ob das Element ein identifizierendes Attribut besitzt: name und id sind per se identifizierend, andere Attribute wie z.B. class müssen auf Eindeutigkeit geprüft werden. Diese Prüfung muss auf dem parentElement fortgesetzt werden, bis eine Eindeutigkeit vorliegt. Über den dabei aufgezeichneten Pfad kann man das Element dann später lokalisieren und den Text herausziehen. Freundliche Grüße |
Re: Position von Text/Links in einer HTML Datei finden
Moin marabu,
auf dem Server lassen sich keine Anwendungen installieren. Auf dem PC wird mit einer Software ein System konfiguriert welches dann komplett als "OS" auf den Server übertragen wird. Dieses "OS" enthält eben auch die Möglichkeit das nicht nur die Lichtsteuerung etc darüber läuft, sondern auch ein VISU PC (z.B. Touchscreen in der Wand) angesteuert wird. Diese zeigen dann Licht und Fensterzustände etc. Alle Informationen werden in sogenannten KO (Kommunikationsobjekte) oder iKO (Interne Kommunikationsobjekte) gespeichert und verarbeitet. So können Logiken erstellt und verarbeitet werden. Beispiel: Wenn KO "1/2/3" (Das KO für Lichtwert aussen) unter 5 Lux fällt aktiviere KO "2/3/4" (Das KO für Automatikschalter/Bewegungsmelder), damit bei einer festgestellten Bewegung das Licht nur angeht, wenn es draussen dunkel ist. Interne KO's nutzt der Server für diverse Informations speicherung. Eben auch für Werte die man mit dem HTML Parser aus Quelltexten (mit. o.g. Scripten) ermittelt um diese dann auf den VISU Seiten (ähnlich eines Webbrowsers) darstellen kann. Der einer will sich die Formel1 Ergebnisse anzeigen lassen. Der andere Wetterdaten oder das akt. Fernsehprogramm. Also wird ein Script für die Durchsuchung einer Webseite geschrieben, was diese Informationen dann in die iKO's schreibt, um sie dann auf dem Display anzuzeigen. Einen Webbrowser hat der Server nicht. Er kann auch nicht mit HTML direkt umgehen. Sondern nur beliebige Dateien Parsen und gewünschte Werte für die Verarbeitung in iKO's schreiben. Die Scripterstellung habe ich ja oben im groben beschrieben. Damit der Parser eben ein Wert findet , muss ihm gesagt werden was vor und nach dem gewünschten Wert/Text steht. Das macht es eben unabdingbar, das der Benutzer alle sinnvollen Informationen einer Page aufgelistet bekommt und für die Scripterstellung muss ich eben die Position (z.B. Wert beginnt bei 155'zigtem Zeichen im String) wissen. Nur dann kann ich die Quelltext nach den benötigten Zeichen durchsuchen. Gruß Hiele |
Re: Position von Text/Links in einer HTML Datei finden
Moin zusammen,
erstmal habt Dank für eure zahlreiche Hilfe oben. Ich habe jetzt selbst ein Parser gebastelt. Mit einer while Schleife. Da der Quelltext ja in einem Richedit liegt. NUR ist die Suche (das durchlaufen) extrem lahm. Gibt es eine schnellere Methode einen "String" zur durchsuchen. Mit der while Schleife analysiere ich Zeichen für Zeichen um mir die notwendigen Positionen zu protokollieren. Gruß Hiele |
Re: Position von Text/Links in einer HTML Datei finden
Moin Hiele,
Zitat:
Wenn ja: Übertrag' die mal vor der Schleife in eine Stringvariable, und arbeite mit der. Wenn nein: Zeig' mal wie Du es machst. |
Re: Position von Text/Links in einer HTML Datei finden
Hallo Hiele,
wie greifst du denn auf den Text des RichEdit zu? Kannst du Code zeigen? Dein Problem habe ich inzwischen verstanden, habe auch einen Ansatz entwickelt und implementiert. Ich markiere den zu extrahierenden Text im Browser. Dann ersetze ich den ausgewählten Text im DOM durch eine interne Markierung, wobei ich den vorherigen Inhalt zwischenspeichere. Jetzt kann ich die Stelle im Markup ermitteln, an der die Markierung steht. Ab hier ist es eine Frage des Ehrgeizes, ob ich das vollständige HTML bis zur gefundenen Stelle als Prefix nehme oder den Riesen-String soweit verkleinere, dass er gerade noch eindeutig ist. Sagen wir mal so: Es gibt Testfälle, die erfolgreich verarbeitet werden, aber zufrieden bin ich noch nicht. Wenn du mit deinem Textparser glücklich bist, dann stampfe ich das wieder ein, denn momentan bin ich arg im Stress, was meine kommerziellen Projekte betrifft. Freundliche Grüße |
Re: Position von Text/Links in einer HTML Datei finden
Hi marabu,
das was du da machst ist genau, was ich wollte. Der Textparser ist lediglich eine Notlösung und dauert furchtbar lange. Aber Arbeit geht vor - lass dich also von mir (und meinen Vorstellungen) nicht ablenken. Mein Delphiwissen ist dem kaum würdig :oops: (Naja vieleicht ein bischen) Wäre aber schön, wenn du dran bleibst, ist bei mir nicht allzu Zeitkritisch. Aber für ein Tip um die Prozedur zu beschleunigen wäre ich dankbar. Mit doc.body.innerHTML habe ich es auch schon versucht. Würde ein virtueller Richedit das beschleunigen? Gruß Hiele Hier der Parser:
Delphi-Quellcode:
procedure TForm4.sbanalyseClick(Sender: TObject);
var i2 : longint; // Für verschachtelte Tags s, stag : string; // s=Text/Link/Bild stag=Was für ein Tag tagclose,scriptclose : boolean; // Verschachtelter Tag geschlossen / Script geschlossen listitem : TListItem; // Ergebnissliste (Text/Link/Bild mit Position) begin // Quelltextparser progbar.Max := length(quelltext1.Text); //Status des Parsers progbar.Visible := true; liste.Clear; // Ergebnissliste vorbereiten liste.Items.BeginUpdate; posqt := 0; // Position im Quelltext s := ''; i2 := 0; stag := ''; tagclose := false; scriptclose := false; statusbar.Panels[0].Text := 'Analysiere Page ...'; while posqt < length(quelltext1.text) do begin if quelltext1.text[posqt] = '<' then begin s := ''; inc(posqt); application.ProcessMessages; progbar.Position := posqt; // IST SCRIPT if lowercase(copy(quelltext1.text,posqt,6)) = 'script' then begin while not(scriptclose) and (posqt<length(quelltext1.text)) do begin if lowercase(copy(quelltext1.text,posqt,5)) <> '</scr' then inc(posqt) else scriptclose := true; application.ProcessMessages; end; end else begin // IST Normaler Tags stag := ''; stag := stag + quelltext1.text[posqt]; while not(tagclose) and (posqt<length(quelltext1.text)) do begin if (quelltext1.text[posqt] = '>') and (i2 = 0) then tagclose := true; if (quelltext1.text[posqt] = '<') then inc(i2); if (i2>0) and (quelltext1.text[posqt]='>') then dec(i2); // IST LINK if (lowercase(copy(quelltext1.text,posqt,6)) = 'href="') and mlinks.checked then // Suche nach Links begin // LINK FINDEN inc(posqt,6); application.ProcessMessages; while quelltext1.text[posqt] <> '"' do begin s := s + quelltext1.text[posqt]; inc(posqt); progbar.Position := posqt; end; // LINK HINZUFÜGEN listitem := liste.Items.Add; listitem.Caption := s; listitem.ImageIndex := 10; listitem.StateIndex := 10; listitem.SubItems.Add(inttostr(posqt)); s := ''; end; // IST BILD if (lowercase(copy(quelltext1.text,posqt,5)) = 'src="') and mbilder.checked then // Suche nach Bildern begin // BILD FINDEN inc(posqt,5); while quelltext1.text[posqt] <> '"' do begin s := s + quelltext1.text[posqt]; inc(posqt); progbar.Position := posqt; end; // BILD HINZUFÜGEN listitem := liste.Items.Add; listitem.Caption := s; listitem.ImageIndex := 11; listitem.StateIndex := 11; listitem.SubItems.Add(inttostr(posqt)); s := ''; end; stag := stag + quelltext1.text[posqt]; inc(posqt); progbar.Position := posqt; application.ProcessMessages; end; i2 := 0; tagclose := false; scriptclose := false; end; end else begin if mtext.checked then // MIT TEXT (Suche nach Texten) begin while (quelltext1.text[posqt] <> '<') and (posqt<length(quelltext1.text)) do begin s := s + quelltext1.text[posqt]; inc(posqt); progbar.Position := posqt; application.ProcessMessages; end; if length(s)>0 then if (s[1] in ['a'..'z','A'..'Z','0'..'9']) and (copy(stag,1,2)<>'<!') then begin listitem := liste.Items.Add; listitem.Caption := s; listitem.ImageIndex := 8; listitem.StateIndex := 8; listitem.SubItems.Add(inttostr(posqt)); stag := ''; end; end else inc(posqt); end; end; statusbar.Panels[0].Text := 'Fertig!'; progbar.Visible := false; liste.Items.EndUpdate; end; |
Re: Position von Text/Links in einer HTML Datei finden
Moin Hiele,
wie ich schon vermutet hatte ;-) Probier's mal so:
Delphi-Quellcode:
Der Performanceverlust rührt daher, dass bei jedem Zugriff auf Text diese Eigenschaft aus den Lines zusammengesetzt wird.
var
// Deine sonstigen Variablen sContent : string; begin sContent := quelltext1.Text; // Der Rest Deiner Routine // Hierbei muss dann aber quelltext1.Text durch sContent ausgetauscht werden end; |
Re: Position von Text/Links in einer HTML Datei finden
Hi Christian,
ist deutlich zu merken, Danke. Zwar dauert diese Lösung bei 80kb Seiten wie Wetter.com zwar immernoch lange, doch es passiert erkennbar was. Bekomme ich bei 80.000 Zeichen im string keine Probleme? Gruß Hiele |
Re: Position von Text/Links in einer HTML Datei finden
Moin Hiele,
Zitat:
(abzüglich dessen, was der Rest des Programmes benötigt) |
Re: Position von Text/Links in einer HTML Datei finden
guten abend
ich suche für ein Ähnliches Problem eine Lösung und bin bisher noch nicht fündig geworden... ich hänge das einfach mal an muss ja nicht unbedingt das Forum zumüllen ;-) ich habe im twebbrowser eine Seite geöffenet.. im Quelltext der Seite soll nach einer bestimmten Zeichenkombination gesucht werden nehmen wir an '-a-' links von der Zeichenkombination stehen noch buchstaben die wichtig sind und rechts ebenfalls ich möchte das ganze in einen string packen... nach links und nach rechts wird der wichtige Teil jeweils durch ein " abgegrenzt es handelt sich um eine emailadresse.... der schlüssel ist also die oben genannte Zeichenkombination achso die Zeciehnkombi kommt 2 mal in der Webseite vor! die für mich wichtige ist die 2te ... Wäre super dankbar für einen Lösungsvorschlag vielen Dank Schlönen abend noch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 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