如何在WebBrowser控件中获取呈现的HTML(由Javascript处理)?

我有一个ASP.NET页面和一些自定义类来获取指定的网页,并返回此页面主体。

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做了一些额外的操作。

这里是我发现运行javascript后呈现的HTML(DOM)的一个解决scheme:

将一个名为webBrowser1的WebBrowser控件放在Form1的窗体上。

[Form1.cs的[devise]

然后用于代码使用:

[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; } } } } 

将Form1_Load中的webBrowser1.Navigate(“ http:// localhost:6489 / Default.aspx ”)参数更改为您希望获得的javascript处理后的DOM页面。

您可以在CallServerSideCode()方法中访问修改的DOM,例如:

 doc.GetElementById("myDataTable"); 

或者你可以像这样访问呈现的HTML:

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

正如乔治在其中一个评论中所说的那样,理论上你只需要使用以下方法就可以在webBrowser1_DocumentCompleted中获得DOM:

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

先有一点背景。 我一直在试图从网页上刮取信息。 这个网页的内容是dynamic的。 我的意思是dynamic的是,当您向下滚动到页面底部时,网页会加载更多的信息。 当您滚动到页面底部时,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 

像魅力一样工作。 希望这可以帮助别人。

另一种方法是在窗体上设置一个计时器,然后当计时器命中时,页面将被重新渲染,并且可以parsing页面。

你可以得到

webBrowser1.Document.Body.OuterHtml