Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Auslesen von Quelltext nach Scriptlauf mit EdgeBrowser (https://www.delphipraxis.net/215396-auslesen-von-quelltext-nach-scriptlauf-mit-edgebrowser.html)

herik 26. Jun 2024 05:21

Auslesen von Quelltext nach Scriptlauf mit EdgeBrowser
 
Hallo Gemeinde,

Ich bin dabei Daten von einem Webseite zu holen.
Hierbei bin ich aber auf ein Problem gestoßen, welches ich nicht in den Griff bekomme.

Zu meinem vorgehen.

Ich verwende TEdgeBrowser um mir den Quelltext der betreffenden Webseite nach dem ausführen des JavaScript zu holen.
Den Quelltext Speicher ich im Anschluss in eine Datei.

Delphi-Quellcode:
procedure TForm2.EdgeBrowser1NavigationCompleted(Sender: TCustomEdgeBrowser;
  IsSuccess: Boolean; WebErrorStatus: TOleEnum);
begin
  EdgeBrowser1.ExecuteScript('encodeURI(document.documentElement.outerHTML)');
end;
Delphi-Quellcode:
procedure TForm1.EdgeBrowser1ExecuteScript(Sender: TCustomEdgeBrowser;
  AResult: HRESULT; const AResultObjectAsJson: string);
var
  OutputSL: TStringList;
begin
  if AResultObjectAsJson <> 'null' then
  begin
    OutputSL := TStringList.Create;
    try
      OutputSL.Text := TNetEncoding.URL.Decode(AResultObjectAsJson).DeQuotedString('"');
      OutputSL.Text := HTMLEntitiesDecode(OutputSL.Text);
      Memo1.Text := OutputSL.Text;


      OutputSL.SaveToFile(ExtractFilePath(ParamStr(0)) + '\Quelltext.txt', TEncoding.UTF8);
      Edgebrowser1.NavigateToString(OutPutSl.Text);
    finally
      OutputSL.Free;
    end;
  end;
end;
Das funktioniert erstmal augenscheinlich. Der Quelltext wird ordentlich in eine Datei geschrieben.



Im nächsten Schritt will ich mit Python und beautifulsoup Werte auslesen. Und genau hier liegt nun mein Problem.
Wenn ich nun mein Python Script über meine gespeicherte Datei laufen lasse, werden keine Werte erkannt.


Bei genauerer Kontrolle des Quelltextes nach dem es durch beautifulsoup geparst wurde, entstehen haufenweise Stellen wo ">" durch "&gt" oder ">" durch "&lt" ersetzt wurden.:?
Also konnte der Parser den durch den EdgeBrowser ausgegebenen Quelltext nicht richtig parsen.

In der Gespeicherten Datei (Ausgegebener Quelltext durch EdgeBrowser) sind die Zeichen "&gt" und "&lt" nicht zu finden!

Code:
Datei = open("Quelltext.txt", "r" , encoding='utf-8')
So öffne ich die Datei im Python.


Nun weiß ich nicht recht wo ich ansetzen kann um zu meinem Gewünschten Ergebnis zu kommen.

Zur Kontrolle hatte ich noch folgende Zeile im Delphi mit eingefügt.
Delphi-Quellcode:
Edgebrowser1.NavigateToString(OutPutSl.Text);
Dies übergibt den Quelltext erneut an den EdgeBrowser und wird dann angezeigt.
Aber auch hier wird nicht alles Richtig angezeigt. Es scheint so, als wenn genau diese Bereiche die Python nicht lesen kann, auch hier fehlen.

Eventuell habt Ihr ja eine Idee wo ich noch nachschauen kann, oder was ich noch anders machen kann.

Wenn Ihr mehr Informationen Braucht, dann bitte fragen. Ich wollte das Thema jetzt hier nicht so überladen.

Vielen Dank schon mal :)

gubbe 26. Jun 2024 05:54

AW: Auslesen von Quelltext nach Scriptlauf mit EdgeBrowser
 
Warum kodierst Du den HTML-Quelltext in Javascript noch mit EncodeURI? Du bekommst doch sowieso den Text als JSON zurück.

Das hier genügt:

Delphi-Quellcode:
  EdgeBrowser1.executescript('document.documentElement.outerHTML');


Und dann
Delphi-Quellcode:
uses System.json, System.IOUtils;
...

procedure TForm2.EdgeBrowser1ExecuteScript(Sender: TCustomEdgeBrowser;
  AResult: HRESULT; const AResultObjectAsJson: string);
var
  json: TJSONValue;
begin
  json := TJSONObject.ParseJSONValue(AResultObjectAsJson);
  TFile.writeAllText('test.html', json.AsType<string>, TEncoding.UTF8);
  json.Free;
end;

herik 26. Jun 2024 08:25

AW: Auslesen von Quelltext nach Scriptlauf mit EdgeBrowser
 
Hallo gubbe,

Warum ich EncodeURI verwende, ganz einfach. Ich wusste es nicht besser und habe mich dabei auf DIESE WEBSEITE bezogen.

Das das nicht so optimal war hast du mir zum Glück gesagt! :thumb:


Ich habe jetzt einfach mal deine Variante verwendet und es läuft so wie ich es wollte.


Vielen herzlichen Dank an der Stelle!

shebang 26. Jun 2024 13:22

AW: Auslesen von Quelltext nach Scriptlauf mit EdgeBrowser
 
Zitat:

Zitat von herik (Beitrag 1538235)
Warum ich EncodeURI verwende, ganz einfach. Ich wusste es nicht besser und habe mich dabei auf DIESE WEBSEITE bezogen.

Der Fairness halber muss erwähnt werden, dass im nächsten Absatz auf der Webseite steht, dass man das JSON auch wieder dekodieren soll. :wink:

PS: Das Projekt Python4Delphi kennst du schon?

gubbe 26. Jun 2024 13:29

AW: Auslesen von Quelltext nach Scriptlauf mit EdgeBrowser
 
Zitat:

Zitat von shebang (Beitrag 1538261)
Der Fairness halber muss erwähnt werden, dass im nächsten Absatz auf der Webseite steht, dass man das JSON auch wieder dekodieren soll. :wink:

Hat er doch gemacht. Nur ist das obere Kodieren unnötig, da das Ergebnis als JSON zurückgegeben wird, was dann sowieso schon kodiert wird. URLEncode kodiert eben auch URLs und ist hier für den Quelltext auch nur bedingt geeignet, denn beim Umwandeln in JSON werden möglicherweise Zeichen nochmal kodiert und dann mit einem einfachen Decode nicht wieder richtig hergestellt.

shebang 26. Jun 2024 13:59

AW: Auslesen von Quelltext nach Scriptlauf mit EdgeBrowser
 
Stimmt, mein Fehler, hab nicht ganz nach oben gescrollt im ersten Beitrag.

herik 27. Jun 2024 04:36

AW: Auslesen von Quelltext nach Scriptlauf mit EdgeBrowser
 
Hallo shebang,

Zitat:

PS: Das Projekt Python4Delphi kennst du schon?
Ja, das Project kenne ich und nutze ich!. Kann ich nur Empfehlen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 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