2012-04-10 18 views

risposta

18

È possibile utilizzare l'interfaccia IPersistStreamInit e il metodo save per archiviare il contenuto del Webbrowser in un flusso.

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; 
+0

funziona. Grazie mille. – Leadri

+0

Come possiamo farlo funzionare in modo REVERSE: SetWebBrowserHTML, re-iniettando di nuovo il codice estratto in precedenza su WebBrowser (o TEmbeddedWebBrowser). Immagino la seguente situazione: un componente memo ottiene il codice sorgente HTML con GetWebBrowserHTML, quindi l'utente apporta alcune modifiche al codice sorgente, quindi il codice sorgente modificato viene reimmesso in WebBrowser. Questo renderebbe un bel editor HTML con anteprima in tempo reale nel browser! – user1580348

+1

Migliore: 'LStream: = TStringStream.Create ('', TEncoding.UTF8);' – user1580348

3

Questo è stato chiesto e risposto molte volte nei forum Embarcadero, con molti esempi di codice pubblicati. Cerca negli archivi.

L'essenza di esso è che si Navigate() per l'URL desiderato e attendere l'evento OnDocumentComplete al fuoco, poi QueryInterface() la proprietà Document per l'interfaccia IPersistStreamInit e chiamare il suo metodo save(). Creare un'istanza dell'oggetto TStream, ad esempio TMemoryStream, inserirla in un oggetto TStreamAdapter e quindi passare l'adattatore a save(). È quindi possibile caricare TStream nello TMemo secondo necessità.

4

che funziona bene ugualmente:

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; 
+0

Sbagliato. questo ti darà la rappresentazione DOM dell'elemento 'document'. Non sarà il codice sorgente HTML. – kobik

+0

Sì, hai ragione, lo stavo usando solo per analizzare alcuni dati disponibili sul codice sorgente HTML e usare la rappresentazione DOM era ok per quello. –

+1

Io inviterò la tua risposta, è utile in ogni caso. Io uso anche un metodo simile nel nostro spider per manipolare/analizzare HTML da un sito web estraneo. – kobik

Problemi correlati