2012-04-10 35 views

Trả lời

18

Bạn có thể sử dụng Giao diện IPersistStreamInit và phương thức save để lưu trữ nội dung của Trình duyệt web trong Luồng.

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

nó hoạt động. Cảm ơn nhiều. – Leadri

+0

Làm thế nào chúng ta có thể làm cho nó hoạt động theo cách REVERSE: SetWebBrowserHTML, do đó tiêm lại mã được trích xuất trước đó trở lại WebBrowser (hoặc TEmbeddedWebBrowser). Tôi tưởng tượng tình huống sau: Một thành phần ghi nhớ lấy mã nguồn HTML bằng GetWebBrowserHTML, sau đó người dùng thực hiện một số thay đổi đối với mã nguồn, sau đó mã nguồn đã thay đổi được tiêm lại vào WebBrowser. Điều này sẽ làm cho một trình soạn thảo HTML đẹp với xem trước thời gian thực trong trình duyệt! – user1580348

+1

Tốt hơn: 'LStream: = TStringStream.Create ('', TEncoding.UTF8);' – user1580348

3

Điều này đã được hỏi và trả lời nhiều lần trong các diễn đàn Embarcadero, với nhiều ví dụ mã được đăng. Tìm kiếm lưu trữ.

Các ý chính của nó là bạn Navigate() đến URL mong muốn và chờ đợi cho sự kiện OnDocumentComplete để bắn, sau đó QueryInterface() các Document thuộc tính cho giao diện IPersistStreamInit và gọi phương thức save() của nó. Tạo một đối tượng TStream đối tượng, chẳng hạn như TMemoryStream, bọc nó trong đối tượng TStreamAdapter và sau đó chuyển bộ điều hợp tới save(). Sau đó, bạn có thể tải TStream vào số TMemo khi cần.

4

Đó hoạt động tốt quá:

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

Sai. điều này sẽ giúp bạn trình bày DOM của phần tử 'document'. Nó sẽ không phải là mã nguồn HTML. – kobik

+0

Có bạn đúng, tôi đã sử dụng nó chỉ để phân tích một số dữ liệu có sẵn trên nguồn html và sử dụng đại diện DOM là ok cho điều đó. –

+1

Tôi sẽ upvote câu trả lời của bạn, Nó hữu ích trong mọi trường hợp. Tôi cũng sử dụng một phương pháp tương tự trong spider của chúng tôi để thao tác/phân tích HTML từ một trang web nước ngoài. – kobik

Các vấn đề liên quan