将当前的WebBrowser DOM作为HTML获取

Sam*_*Ash 4 html c# video xpath

我想在WebBrowser上使用HTML能力包,它已经加载了我需要的所有东西(它点击一个带有代码的按钮来加载频道上的每个视频)(它加载一个YouTube频道,然后在所述频道上加载所有视频.)现在,如果我尝试获取所有视频详细信息(我有一个工作代码将频道的前30个视频导入列表视图),它仍然只显示前30个,但我在WebBrowser上加载了所有视频page(显示所有视频)我正在使用它来获取当前从WebBrowser加载的内容

在此输入图像描述

但它仍然只加载前30个视频而不是从WebBrowser加载的所有视频.

nos*_*tio 5

如果目标网站大量使用AJAX(如Youtube所做的那样),那么确定页面何时完成加载并执行所有动态脚本是很困难的,如果不是不可能的话.但是你可以通过处理window.onload事件来接近,并允许额外的一两秒用于非确定性的AJAX调用.然后调用webBrowser.Document.DomDocument.documentElement.outerHTMLvia dynamic来获取当前呈现的HTML.

例:

private void Form1_Load(object sender, EventArgs e)
{
    DownloadAsync("http://www.example.com").ContinueWith(
        (task) => MessageBox.Show(task.Result),
        TaskScheduler.FromCurrentSynchronizationContext());
}

async Task<string> DownloadAsync(string url)
{
    TaskCompletionSource<bool> onloadTcs = new TaskCompletionSource<bool>();
    WebBrowserDocumentCompletedEventHandler handler = null;

    handler = delegate
    {
        this.webBrowser.DocumentCompleted -= handler;

        // attach to subscribe to DOM onload event
        this.webBrowser.Document.Window.AttachEventHandler("onload", delegate
        {
            // each navigation has its own TaskCompletionSource
            if (onloadTcs.Task.IsCompleted)
                return; // this should not be happening
            // signal the completion of the page loading
            onloadTcs.SetResult(true);
        });
    };

    // register DocumentCompleted handler
    this.webBrowser.DocumentCompleted += handler;

    // Navigate to url
    this.webBrowser.Navigate(url);

    // continue upon onload
    await onloadTcs.Task;

    // artificial delay for AJAX
    await Task.Delay(1000);

    // the document has been fully loaded, can access DOM here
    return ((dynamic)this.webBrowser.Document.DomDocument).documentElement.outerHTML;
}
Run Code Online (Sandbox Code Playgroud)

[已编辑]以下是帮助解决OP问题的最后一段代码:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(((dynamic)this.webBrowser1.Document.DomDocument).documentElement.ou??terHTML); 
Run Code Online (Sandbox Code Playgroud)