C# 如何在WebBrowser控件中获得呈现的html(由Javascript处理)?
我有一个C# 如何在WebBrowser控件中获得呈现的html(由Javascript处理)?,c#,jquery,asp.net,html,browser,C#,Jquery,Asp.net,Html,Browser,我有一个ASP.NET页面和一些自定义类,它们获取指定的网页并返回该页面正文 受保护的字符串GetHtml() { 线程线程=新线程(新线程开始(GetHtmlWorker)); SetApartmentState(ApartmentState.STA); thread.Start(); thread.Join(); 返回TML; } 受保护的无效GetHtmlWorker() { 使用(WebBrowser浏览器=新WebBrowser()) { browser.ScriptErrorsSup
ASP.NET
页面和一些自定义类,它们获取指定的网页并返回该页面正文
受保护的字符串GetHtml()
{
线程线程=新线程(新线程开始(GetHtmlWorker));
SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
返回TML;
}
受保护的无效GetHtmlWorker()
{
使用(WebBrowser浏览器=新WebBrowser())
{
browser.ScriptErrorsSuppressed=true;
browser.Navigate(_url);
//等待控件加载页面
while(browser.ReadyState!=WebBrowserReadyState.Complete)
Application.DoEvents();
docHtml=browser.DocumentText;
}
}
但是我需要的是获取
domhtml
,而不是页面源代码,因为我通过jQuery
对DOM
执行了一些额外的操作,我发现了一个解决方案,可以在运行javascript后获取呈现的HTML(DOM):
将名为webBrowser1的WebBrowser控件放置在类Form1的窗体上
[表格1.cs[设计]]
然后,对于代码使用:
[表格1.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\u Load中的webBrowser1.Navigate(“”)参数更改为希望通过javascript处理其DOM的页面
您可以在CallServerSideCode()方法中访问修改后的DOM,例如:
doc.GetElementById("myDataTable");
或者,您可以访问呈现的HTML,如下所示:
var renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml;
正如George在其中一条评论中所说,理论上,您只需使用以下命令即可完成webBrowser1_文档中的DOM:
webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml;
首先是一点背景知识。我一直在试图从网页上抓取信息。此网页的内容是动态的。我所说的动态是指当你向下滚动到页面底部时,网页会加载更多的信息。当您滚动到页面底部时,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
工作得很有魅力。希望这对其他人也有帮助。另一种方法是在表单上设置计时器,然后当计时器点击时,页面将重新呈现,您可以解析页面 你可以 webBrowser1.Document.Body.OuterHtml
那么您需要的是javascript修改后的DOM html?你想把它当作一根绳子吗?这是一个很好的答案,Răzvan Panda!!!我用你们的代码阅读了一些cold fusion动态渲染页面,它一直工作到我不得不重建我的系统。现在,我看不到实际呈现的数据(内部/外部)html无法返回我看到的内容。有没有别的地方或方法可以让我退休呢???@cocoanewee:我不知道还有什么别的方法,我是通过研究学会的。您描述它的方式就像,您也无法以其他方式获得它。为什么不在webBrowser1_文档中执行它呢?像webBrowser1.Document.GetElementsByTagName(“HTML”)[0]。OuterHtmlWorked for me谢谢。我希望微软能把他们的文档弄清楚,而不是建议DocumentText属性返回dom。谢谢。这对我很有帮助。谢谢,它包含了所有ajax的html