AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Position von Text/Links in einer HTML Datei finden
Thema durchsuchen
Ansicht
Themen-Optionen

Position von Text/Links in einer HTML Datei finden

Ein Thema von Hiele · begonnen am 18. Sep 2007 · letzter Beitrag vom 19. Jan 2008
Antwort Antwort
Seite 2 von 3     12 3      
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#11

Re: Position von Text/Links in einer HTML Datei finden

  Alt 20. Sep 2007, 08:58
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
  Mit Zitat antworten Zitat
Hiele

Registriert seit: 21. Feb 2005
Ort: Berlin
16 Beiträge
 
Delphi 6 Enterprise
 
#12

Re: Position von Text/Links in einer HTML Datei finden

  Alt 20. Sep 2007, 10:12
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
  Mit Zitat antworten Zitat
Hiele

Registriert seit: 21. Feb 2005
Ort: Berlin
16 Beiträge
 
Delphi 6 Enterprise
 
#13

Re: Position von Text/Links in einer HTML Datei finden

  Alt 21. Sep 2007, 10:48
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Position von Text/Links in einer HTML Datei finden

  Alt 21. Sep 2007, 11:31
Moin Hiele,

Zitat von Hiele:
Mit der while Schleife analysiere ich Zeichen für Zeichen um mir die notwendigen Positionen
zu protokollieren.
Machst Du das etwa über die Eigenschaft TRichEdit.Lines.Text?

Wenn ja:
Übertrag' die mal vor der Schleife in eine Stringvariable, und arbeite mit der.

Wenn nein:
Zeig' mal wie Du es machst.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#15

Re: Position von Text/Links in einer HTML Datei finden

  Alt 21. Sep 2007, 11:33
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
  Mit Zitat antworten Zitat
Hiele

Registriert seit: 21. Feb 2005
Ort: Berlin
16 Beiträge
 
Delphi 6 Enterprise
 
#16

Re: Position von Text/Links in einer HTML Datei finden

  Alt 21. Sep 2007, 11:52
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 (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)) = 'scriptthen
      begin
        while not(scriptclose) and (posqt<length(quelltext1.text)) do
        begin
          if lowercase(copy(quelltext1.text,posqt,5)) <> '</scrthen 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;
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Position von Text/Links in einer HTML Datei finden

  Alt 21. Sep 2007, 12:12
Moin Hiele,

wie ich schon vermutet hatte

Probier's mal so:


Delphi-Quellcode:
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;
Der Performanceverlust rührt daher, dass bei jedem Zugriff auf Text diese Eigenschaft aus den Lines zusammengesetzt wird.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Hiele

Registriert seit: 21. Feb 2005
Ort: Berlin
16 Beiträge
 
Delphi 6 Enterprise
 
#18

Re: Position von Text/Links in einer HTML Datei finden

  Alt 21. Sep 2007, 12:26
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Position von Text/Links in einer HTML Datei finden

  Alt 21. Sep 2007, 12:31
Moin Hiele,

Zitat von Hiele:
Bekomme ich bei 80.000 Zeichen im string keine Probleme?
ein String kann bis zu 2 GB Daten enthalten.
(abzüglich dessen, was der Rest des Programmes benötigt)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Mushroomfreak07

Registriert seit: 23. Dez 2007
26 Beiträge
 
#20

Re: Position von Text/Links in einer HTML Datei finden

  Alt 18. Jan 2008, 23:44
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz