2016-02-12 98 views
2

我正在嘗試使用循環來下載一堆html頁面並在數據內部進行報廢。但是這些頁面在加載時有一些javascript作業正在運行。所以我認爲使用webclient可能不是一個好的選擇。但是,如果我使用下面的webBrowser。它在循環中首次調用後返回空html字符串。c#在頁面加載完成後下載html字符串

WebBrowser wb = new WebBrowser(); 
     wb.ScrollBarsEnabled = false; 
     wb.ScriptErrorsSuppressed = true; 
     wb.Navigate(url); 
     while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); Thread.Sleep(1000); } 
     html = wb.Document.DomDocument.ToString(); 
+0

,如果使用的WebClient downloadstring方法是什麼?它有幫助嗎? – User2012384

回答

3

你是正確的,WebClient的&所有其他HTTP客戶端界面會完全忽略的JavaScript的;畢竟他們都不是瀏覽器。

你想:

var html = wb.Document.GetElementsByTagName("HTML")[0].OuterHtml; 

請注意,如果您通過web瀏覽器加載,你不需要刮原始標記;您可以使用像GetElementById/TagName等DOM方法。

while循環非常VBScript,您應該將代碼連接到DocumentCompleted事件。


private void Whatever() 
{ 
    WebBrowser wb = new WebBrowser(); 
    wb.DocumentCompleted += Wb_DocumentCompleted; 

    wb.ScriptErrorsSuppressed = true; 
    wb.Navigate("http://stackoverflow.com"); 
} 

private void Wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    var wb = (WebBrowser)sender; 

    var html = wb.Document.GetElementsByTagName("HTML")[0].OuterHtml; 
    var domd = wb.Document.GetElementById("copyright").InnerText; 
    /* ... */ 
} 
+0

非常感謝Alex。這是我正在尋找的確切答案。你能告訴我如何添加DocumentCompleted事件嗎? –

+0

用示例編輯。 –

+0

亞歷克斯。謝謝。這是控制檯應用程序。我使用這段代碼,但沒有觸發 Wb_DocumentCompleted函數。 –