如何在 WebBrowser 控件中获取呈现的 html(由 Javascript 处理)?
Posted
技术标签:
【中文标题】如何在 WebBrowser 控件中获取呈现的 html(由 Javascript 处理)?【英文标题】:How to get rendered html (processed by Javascript) in WebBrowser control? 【发布时间】:2011-11-12 03:14:30 【问题描述】:我有一个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修改后的DOM html吗?你想要它作为一个字符串吗? 【参考方案1】:这是我发现的一种解决方案,可以在运行 javascript 后访问呈现的 HTML(DOM):
在 Form1 类的 Form 上放置一个名为 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;
将Form1_Load中的webBrowser1.Navigate("http://localhost:6489/Default.aspx")参数更改为您希望获取的经过javascript处理后的DOM的页面。
可以在CallServerSideCode()方法中访问修改后的DOM,例如:
doc.GetElementById("myDataTable");
或者您可以像这样访问呈现的 HTML:
var renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml;
【讨论】:
这是一个很好的答案 Răzvan Panda!!!我使用您的代码读取了一些冷融合动态渲染页面,它一直有效,直到我不得不重建我的系统。现在,我看不到实际呈现的数据(内部/外部)html 无法返回我看到的内容。有没有其他地方或方法可以用来回收它?? @CocoaNewBee:我不知道任何其他方式,我通过研究学习了这种访问它的方式。你描述它的方式,就像,你不能用另一种方式来理解它。 为什么不在 webBrowser1_DocumentCompleted 中像 webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml 那样做 为我工作谢谢。我希望微软已经明确他们的文档,而不是建议 DocumentText 属性将返回 dom。【参考方案2】:正如 George 在其中一个 cmets 中所说,理论上您只需使用以下命令即可获取 webBrowser1_DocumentCompleted 中的 DOM:
webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml;
【讨论】:
谢谢,它包含了ajax的所有html【参考方案3】:首先是一点背景。我一直在尝试从网页上抓取信息。此网页的内容是动态的。我所说的动态是指当您向下滚动到页面底部时,网页会加载更多信息。当您滚动到页面底部时,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
工作就像一个魅力。希望这对某人也有帮助。
【讨论】:
【参考方案4】:另一种方法是在表单上设置一个计时器,然后当计时器达到时,页面将重新呈现,您可以解析页面。
【讨论】:
【参考方案5】:你可以得到
webBrowser1.Document.Body.OuterHtml
【讨论】:
以上是关于如何在 WebBrowser 控件中获取呈现的 html(由 Javascript 处理)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# WebBrowser 控件中获取重定向的 url
有没有办法在 wpf WebBrowser 控件之上呈现 WPF 控件?