Chromium Label /Text von Webseite auslesen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
lazarusjulian
Beiträge: 39
Registriert: Mi 6. Jan 2016, 21:45

Chromium Label /Text von Webseite auslesen

Beitrag von lazarusjulian »

Hallo,

ich habe mir nach dieser Anleitung die Chromium Komponente installiert
http://lazplanet.blogspot.de/2015/09/cr ... using.html
und würde nun gerne bestimmte Informationen von der geladenen Webseite auslesen, am besten geht das wohl über die ID des Elements..
Wie kann ich das auslesen ?

Mit Javascript bekomm ich es hin, habe aber keine Ahnung, wie ich den Output vom Javascript an mein Programm geben könnte.

Code: Alles auswählen

 
  chromium.Browser.MainFrame.ExecuteJavaScript('var t=document.getElementById("position-3873").textContent','',0);
  chromium.Browser.MainFrame.ExecuteJavaScript('alert(t)','',0);     
 


Kann Jemand helfen ?? =)

Benutzeravatar
theo
Beiträge: 10461
Registriert: Mo 11. Sep 2006, 19:01

Re: Chromium Label /Text von Webseite auslesen

Beitrag von theo »

Gibt es einen Grund, warum das zuerst in den Webbrowser muss?
Kannst du nicht einfach das HTML downloaden und auswerten?

lazarusjulian
Beiträge: 39
Registriert: Mi 6. Jan 2016, 21:45

Re: Chromium Label /Text von Webseite auslesen

Beitrag von lazarusjulian »

theo hat geschrieben:Gibt es einen Grund, warum das zuerst in den Webbrowser muss?
Kannst du nicht einfach das HTML downloaden und auswerten?


Ja :mrgreen:

Ich baue mir einen Web Bot, und da fände ich es umständlich die Seite nochmals runterzuladen. Zumal Teile der Seite erst nach Login sichtbar sind.

cheers, Julian

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Chromium Label /Text von Webseite auslesen

Beitrag von Michl »

Habe es eben bei mir probiert und funktioniert reduziert so:

Code: Alles auswählen

type
  TCustomRenderProcessHandler = class(TCefRenderProcessHandlerOwn)
  protected
    function OnProcessMessageReceived(const browser: ICefBrowser; sourceProcess: TCefProcessId;
      const message: ICefProcessMessage): Boolean; override;
  end;
...
procedure VisitDOM(const Document: ICefDomDocument);
begin
  WriteLn(Document.GetElementById('...').ElementInnerText);
end;
 
function TCustomRenderProcessHandler.OnProcessMessageReceived
  (const browser: ICefBrowser; sourceProcess: TCefProcessId;
  const message: ICefProcessMessage): Boolean;
begin
  case message.Name of
    'visitdom':
      begin
        browser.MainFrame.VisitDomProc(@VisitDOM);
        Result := True;
      end;
    else
      Result := inherited;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Chromium.Browser.SendProcessMessage(PID_RENDERER,TCefProcessMessageRef.New('visitdom')) then
    WriteLn('Triggered DOM visit.')
  else
    WriteLn('Failed to start DOM visit.');
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  CefRenderProcessHandler := TCustomRenderProcessHandler.Create;
end
Die ausführlichere, bessere Variante ist bei FPCEF3 im Ordner Examples\DOMAccess zu finden.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

lazarusjulian
Beiträge: 39
Registriert: Mi 6. Jan 2016, 21:45

Re: Chromium Label /Text von Webseite auslesen

Beitrag von lazarusjulian »

Es kommt zwar leider viiiiiel zu spät, aber DANKE!!! @Michl

Ich hatte das Projekt damals nicht weiter verfolgt und Michls Ansatz nicht verstanden (obwohl c&p es auch getan hätte, Asche auf mein Haupt).
Probiere aber gerade mal wieder was ähnliches in die Richtung.

Im übrigen habe ich noch einen weiteren Ansatz gefunden,
und zwar einfach den HTML-Sourcecode auszulesen und daraus dann meine Informationen zu suchen.
Das funktioniert aber nicht, wenn die Darstellung der Seite aus Javascript zusammen gebaut wurde. (Bsp: https://accounts.google.com/signin )
Da ist Michls Lösung dann eindeutig die bessere Wahl.

Rein der Vollständigkeit halber aber hier nochmal die Lösung für das Auslesen des HTML-Quellcodes:

Code: Alles auswählen

 
procedure CallbackGetSource(const src: ustring); // CallbackGetSource is fired after the end of ChromiumLoadEnd procedure
begin
  Form1.memo1.text := src; //HTML page code is in src
end;
 
 
procedure TForm1.ChromiumLoadEnd(Sender: TObject; const Browser: ICefBrowser;
  const Frame: ICefFrame; httpStatusCode: Integer);
begin
  chromium.Browser.MainFrame.GetSourceProc(@CallbackGetSource);
end;
 

Antworten