Jak mogę uzyskać kod źródłowy ze składnika WebBrowser?Jak mogę uzyskać kod źródłowy HTML z TWebBrowser
Chcę uzyskać kod źródłowy aktywnej strony w komponencie WebBrowser i zapisać go w komponencie Memo.
Dzięki.
Jak mogę uzyskać kod źródłowy ze składnika WebBrowser?Jak mogę uzyskać kod źródłowy HTML z TWebBrowser
Chcę uzyskać kod źródłowy aktywnej strony w komponencie WebBrowser i zapisać go w komponencie Memo.
Dzięki.
Można użyć interfejsu IPersistStreamInit
i metody save do przechowywania zawartości przeglądarki w strumieniu.
Uses
ActiveX;
function GetWebBrowserHTML(const WebBrowser: TWebBrowser): String;
var
LStream: TStringStream;
Stream : IStream;
LPersistStreamInit : IPersistStreamInit;
begin
if not Assigned(WebBrowser.Document) then exit;
LStream := TStringStream.Create('');
try
LPersistStreamInit := WebBrowser.Document as IPersistStreamInit;
Stream := TStreamAdapter.Create(LStream,soReference);
LPersistStreamInit.Save(Stream,true);
result := LStream.DataString;
finally
LStream.Free();
end;
end;
Zostało to zadane i wiele razy udzielane na forach Embarcadero, gdzie zamieszczono mnóstwo przykładów kodu. Przeszukaj archiwa.
Istotą jest to, że ty Navigate()
do żądanego adresu URL i czekać na zdarzenie OnDocumentComplete
na ogień, potem QueryInterface()
właściwość Document
dla interfejsu IPersistStreamInit
i wywołać jego metodę save()
. Utwórz instancję obiektu TStream
, taką jak TMemoryStream
, umieść ją w obiekcie TStreamAdapter
, a następnie przekaż adapter do save()
. Następnie można załadować TStream
do TMemo
w razie potrzeby.
To działa zbyt dobrze:
function GetHTML(w: TWebBrowser): String;
Var
e: IHTMLElement;
begin
Result := '';
if Assigned(w.Document) then
begin
e := (w.Document as IHTMLDocument2).body;
while e.parentElement <> nil do
begin
e := e.parentElement;
end;
Result := e.outerHTML;
end;
end;
Niepoprawnie. dzięki temu uzyskasz reprezentację DOM elementu 'document'. To nie będzie kod źródłowy HTML. – kobik
Tak, masz rację, używałam go tylko do parsowania niektórych danych dostępnych na źródle html i użycie reprezentacji DOM było w porządku. –
Przygotuję twoją odpowiedź, w każdym razie jest przydatna. Używam również podobnej metody w naszym pająku do manipulowania/parsowania HTML z zagranicznej strony internetowej. – kobik
to działa. Dziękuję Ci bardzo. – Leadri
W jaki sposób możemy sprawić, by działało ono w sposób REVERSE: SetWebBrowserHTML, ponownie wstrzykując poprzednio wyodrębniony kod z powrotem do WebBrowser (lub TEmbeddedWebBrowser). Wyobrażam sobie następującą sytuację: Komponent memo pobiera kod źródłowy HTML za pomocą GetWebBrowserHTML, następnie użytkownik wprowadza pewne zmiany w kodzie źródłowym, a następnie zmieniony kod źródłowy jest ponownie wprowadzany z powrotem do WebBrowser. To sprawi, że ładny edytor HTML z podglądem w czasie rzeczywistym w przeglądarce! – user1580348
Lepiej: 'LStream: = TStringStream.Create ('', TEncoding.UTF8);' – user1580348