2011-09-07 30 views
14

我有一個ASP.NET頁面和一些自定義類獲取指定的網頁,並返回此頁面主體。如何在WebBrowser控件中獲取呈現的html(由Javascript處理)?

protected String GetHtml() 
{ 
      Thread thread = new Thread(new ThreadStart(GetHtmlWorker)); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
    thread.Join(); 
    return docHtml; 
} 

protected void GetHtmlWorker() 
{ 
    using (WebBrowser browser = new WebBrowser()) 
    { 

       browser.ScriptErrorsSuppressed = true; 
     browser.Navigate(_url); 

     // Wait for control to load page 
     while (browser.ReadyState != WebBrowserReadyState.Complete) 
      Application.DoEvents(); 

     docHtml = browser.DocumentText; 
    } 

但我需要 - 它是獲取DOM html,而不是源,因爲我通過jQuery做了一些額外的DOM操作。

+1

所以,你需要的是HTML DOM的JavaScript後修改了呢?你想要它作爲一個字符串? –

回答

15

這裏是一個解決方案,我發現去的JavaScript後所呈現的HTML(DOM)的運行:

廣場類Form1的窗體上名爲webBrowser1 WebBrowser控件。

[Form1.cs的[設計]]

然後,對於代碼使用:

[Form1.cs中]

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace WebBrowserTest 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.webBrowser1.ObjectForScripting = new MyScript(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      webBrowser1.Navigate("http://localhost:6489/Default.aspx"); 
     } 

     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      webBrowser1.Navigate("javascript: window.external.CallServerSideCode();"); 
     } 

     [ComVisible(true)] 
     public class MyScript 
     { 
      public void CallServerSideCode() 
      { 
       var doc = ((Form1)Application.OpenForms[0]).webBrowser1.Document; 
      } 
     } 
    } 
} 

更改WebBrowser1.Navigate時(」 http://localhost:6489/Default.aspx 「)參數在Form1_Load中到達您想要獲得的JavaScript處理後的DOM頁面。

您可以訪問修改DOM中CallServerSideCode()方法,例如:

doc.GetElementById("myDataTable"); 

或者您也可以訪問渲染HTML這樣的:

var renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml; 
+0

這是一個很好的答案Răzvan熊貓!我用你的代碼閱讀一些冷聚變動態呈現頁面,它工作,直到我不得不重建我的系統。現在,我看不到實際呈現的數據(內部/外部)html無法返回我所看到的內容。有另一個地方或方法,我可以用來退役嗎? – CocoaNewBee

+0

@CocoaNewBee:我不知道任何其他方式,我通過研究瞭解了這種訪問方式。你描述它的方式就像你無法用另一種方式得到它。 –

+3

爲什麼不這樣做webBrowser1_DocumentCompleted像 webBrowser1.Document.GetElementsByTagName(「HTML」)[0] .OuterHtml – George

4

由於喬治一人說的意見,在理論上你可以得到的DOM中webBrowser1_DocumentCompleted只要使用:

webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml; 
+1

這工作這不是玩笑。 –

2

首先有一點背景。我一直在試圖從網頁上刮取信息。這個網頁的內容是動態的。動態的意思是,當您向下滾動到頁面底部時,網頁會加載更多信息。當您滾動到頁面底部時,HTML內容會發生變化。不幸的是,Web瀏覽器對象不會自動更新這些信息。它仍然具有通過webbrowser.navigate函數首次加載的原始文檔。更新的信息可用於HTMLElementCollection

以下代碼對我無效。

webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml 

我分手了上述聲明如下

Dim eCollections As HtmlElementCollection 
    Dim strDoc As String 
    eCollections = WB.Document.GetElementsByTagName("HTML") 
    strDoc = eCollections(0).OuterHtml 

工作就像一個魅力。希望這也能幫助別人。

+0

謝謝。這幫助了我。 – user1422348

0

另一種方法是在窗體上設置一個計時器,然後當計時器命中時,頁面將被重新渲染,您可以解析頁面。

-1

你可以得到

webBrowser1.Document.Body.OuterHtml

相關問題