如何在 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 而不是页面源,因为我通过jQueryDOM 做了一些额外的操作。

【问题讨论】:

那么你需要的是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 控件?

如何使用webbrowser控件获取网页源代码

webbrowser控件如何获取网页回传的数据

如何从 webBrowser 控件中的当前选定选项中获取 innerText

WebBrowser 控件和 JavaScript 错误