2009-03-24 31 views
6

Làm cách nào để lấy mã nguồn của trang qua WebBrowser Control (ActiveX InternetExplorer)?Làm cách nào để lấy mã nguồn của trang qua WebBrowser-Control (ActiveX InternetExplorer)?

Tôi có tài liệu xml "foo.xml".

var 
Web: TWebBrowser; 
begin 
... 
Web.Navigate("foo.xml"); 
// How can I get source code thru WebBrower control<---- 
... 
end; 
+0

Không chỉ đơn giản là nội dung của tệp foo.xml mà bạn có thể tải trực tiếp? –

+0

Tôi nghĩ rằng đó có thể là một ví dụ. –

+0

XML là kết quả của yêu cầu Http. Nó không phải là một tập tin. – user82002

Trả lời

1

Tôi nghĩ điều này sẽ dễ dàng nhưng có vẻ như nó có thể đã bị lãng quên. Bạn có thể dễ dàng làm điều đó với một điều khiển TidHTTP mặc dù.

MyPage := IdHTTP1.Get('www.google.com'); 

Tôi biết nó không phải thứ bạn muốn nhưng có thể hữu ích.

+0

Tôi biết điều đó. Nhưng tôi muốn biết làm thế nào nó được thực hiện với WebBrowser. – user82002

1

Trong sự kiện DocumentCompleted, hãy xem thuộc tính DocumentText của điều khiển WebBrowser. Nó sẽ có văn bản đầy đủ của trang được tải.

+0

Tôi không thấy tài sản như vậy ở Delphi 2005. Nó có được giới thiệu trong phiên bản sau không? –

1
IHTMLDocument2(Web.Document).Body.InnerHTML; 

Điều này sẽ trả về nguồn của trang.

+0

Sẽ không bỏ qua phần tử HEAD, cũng như việc mở và đóng các thẻ BODY? –

+0

Không hoạt động với nội dung XML. – user82002

+0

Tôi đoán đúng của bạn. Có thể điều này giúp bạn ?: http://www.delphidabbler.com/articles?article=14 –

1

Phương pháp khác hoạt động tốt là sử dụng Synapse. Sử dụng HttpGet gọi hàm synapse để lấy tài nguyên ban đầu của bạn (cung cấp cho bạn mã nguồn) rồi thao tác khi cần.

Một tùy chọn khác là sử dụng thành phần EmbeddedWB để hiển thị MANY nhiều thuộc tính và tính năng của trình duyệt web hơn thành phần Delphi chuẩn và vẫn phù hợp với yêu cầu của bạn khi thực hiện trong trình duyệt web.

+0

Có, nhưng tôi muốn biết làm thế nào tôi có thể làm điều này thông qua ActiveX chỉ. – user82002

+0

Tôi tin rằng thành phần EmbeddedWB WRAPS IE và bao gồm toàn bộ nguồn. Đó là một điểm khởi đầu tốt đẹp để xem nó được thực hiện như thế nào. – skamradt

1

Để truy cập toàn bộ mã HTML của trang thông qua sử dụng WebBrowser kiểm soát của bạn:

Web.Document.All[0].OutterHtml; 
1
private void btnTest_Click(object sender, EventArgs e) 
     { 
      wbMain.Navigate("foo.xml"); 
      wbMain.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(testing); 
     } 

     private void testing(Object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      test = wbMain.DocumentText; 
     } 

Tôi biết điều này là hơi muộn nhưng công trình này cho tôi. wbMain là đối tượng WebBrowser.

1

WebBrowser1.Navigate() tải nó vào cửa sổ thành phần RAD bằng cách sử dụng thành phần IE dựng sẵn trong hệ điều hành Windows. Những gì bạn làm là trả lời một cuộc gọi lại (cho thành phần trình duyệt, bấm đúp vào sự kiện OnDownloadComplete) và lưu nó vào tệp trong hàm đó. Đoạn mã từ mã hoạt động:

procedure TMainForm.WB_SaveAs_HTML(WB : TWebBrowser; const FileName : string) ; 
var 
    PersistStream: IPersistStreamInit; 
    Stream: IStream; 
    FileStream: TFileStream; 
begin 
    if not Assigned(WB.Document) then 
    begin 
    Logg('Document not loaded!') ; //'Logg' adds a line to a log file. 
    Exit; 
    end; 

    PersistStream := WB.Document as IPersistStreamInit; 
    FileStream := TFileStream.Create(FileName, fmCreate) ; 
    try 
    Stream := TStreamAdapter.Create(FileStream, soReference) as IStream; 
    if Failed(PersistStream.Save(Stream, True)) then ShowMessage('SaveAs HTML fail!') ; 
    finally 
    FileStream.Free; 
    end; 

end; (* WB_SaveAs_HTML *) 

procedure TMainForm.WebBrowser1DownloadComplete(Sender: TObject); 
begin 
    if (WebBrowser1.Document<>nil)AND NOT(WebBrowser1.busy) then begin 
     WB_SaveAs_HTML(WebBrowser1,'test.html'); 
     //myStringList.loadFromFile('test.html'); //process it. 
    end; 
end; 

Lưu ý rằng một số loại MIME ("tệp") trong IE sẽ dừng đọc và yêu cầu can thiệp thủ công.

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