【问题标题】:How to get rendered html (processed by Javascript) in WebBrowser control?如何在 WebBrowser 控件中获取呈现的 html(由 Javascript 处理)?
【发布时间】: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 而不是页面源,因为我通过jQueryDOM 做了一些额外的操作。

【问题讨论】:

  • 那么你需要的是javascript修改后的DOM html吗?你想要它作为一个字符串吗?

标签: c# jquery asp.net html browser


【解决方案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

      【讨论】:

        猜你喜欢
        • 2011-02-19
        • 1970-01-01
        • 2012-10-06
        • 1970-01-01
        • 1970-01-01
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多