Tôi làm cách nào để lấy mã nguồn từ thành phần WebBrowser?Tôi làm cách nào để lấy mã nguồn HTML từ TWebBrowser
Tôi muốn lấy mã nguồn của trang hoạt động trên thành phần WebBrowser và ghi nó vào một thành phần Ghi nhớ.
Cảm ơn.
Tôi làm cách nào để lấy mã nguồn từ thành phần WebBrowser?Tôi làm cách nào để lấy mã nguồn HTML từ TWebBrowser
Tôi muốn lấy mã nguồn của trang hoạt động trên thành phần WebBrowser và ghi nó vào một thành phần Ghi nhớ.
Cảm ơn.
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;
Đ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.
Đó 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;
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
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 đó. –
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
nó hoạt động. Cảm ơn nhiều. – Leadri
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
Tốt hơn: 'LStream: = TStringStream.Create ('', TEncoding.UTF8);' – user1580348