Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WebBrowser控件中获得呈现的html(由Javascript处理)?_C#_Jquery_Asp.net_Html_Browser - Fatal编程技术网

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