首頁  >  文章  >  web前端  >  如何透過 .NET WebBrowser 有效檢索動態產生的 HTML?

如何透過 .NET WebBrowser 有效檢索動態產生的 HTML?

DDD
DDD原創
2024-10-18 08:37:29305瀏覽

How to Retrieve Dynamically Generated HTML via .NET WebBrowser Effectively?

如何使用.NET WebBrowser 提取動態生成的HTML

此討論圍繞動態檢索Web 呈現的HTML 內容的挑戰.NET 應用程序中的瀏覽器。

問題:

現有解決方案主要關注 System.Windows.Forms.WebBrowser 類別或 mshtml.HTMLDocument 介面,但沒有令人滿意的結果。從 WebClient 或 mshtml.HTMLDocument 檢索原始 HTML 不會提供瀏覽器渲染產生的動態內容。

研究方法:

  • 使用 Web 瀏覽器存取文件類別無法擷取已渲染的 HTML。
  • 使用 mshtml.HTMLDocument 並解析下載的原始 HTML 也產生了不令人滿意的結果。

優雅的解決方案:

雖然最終的解決方案可能會根據具體要求而有所不同,但技術組合可以提供強大的解決方案:

  1. WebBrowser 控制: 嵌入WebBrowser 控制項以導覽至所需的URL .
  2. 狀態監控:監控IsBusy屬性,直到渲染完成。
  3. 非同步/等待:利用async/await來處理非同步輪詢並簡化程式碼流程。
  4. HTML5 渲染:使用瀏覽器功能控制啟用 HTML5 渲染以確保最新的渲染行為。

程式碼範例:

以下程式碼範例結合了這些技巧來擷取動態HTML 內容:

<code class="csharp">using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using mshtml;

namespace HtmlExtractor
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            SetFeatureBrowserEmulation();
            InitializeComponent();
            this.Load += MainForm_Load;
        }

        async void MainForm_Load(object sender, EventArgs e)
        {
            try
            {
                var cts = new CancellationTokenSource(10000); // cancel in 10s
                var html = await LoadDynamicPage("https://www.google.com/#q=where+am+i", cts.Token);
                MessageBox.Show(html.Substring(0, 1024) + "..."); // it's too long!
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        async Task<string> LoadDynamicPage(string url, CancellationToken token)
        {
            var tcs = new TaskCompletionSource<bool>();
            WebBrowserDocumentCompletedEventHandler handler = (s, arg) =>
                tcs.TrySetResult(true);

            using (token.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: true))
            {
                this.webBrowser.DocumentCompleted += handler;
                try
                {
                    this.webBrowser.Navigate(url);
                    await tcs.Task; // wait for DocumentCompleted
                }
                finally
                {
                    this.webBrowser.DocumentCompleted -= handler;
                }
            }

            var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0];

            var html = documentElement.OuterHtml;
            while (true)
            {
                await Task.Delay(500, token);
                if (this.webBrowser.IsBusy)
                    continue;

                var htmlNow = documentElement.OuterHtml;
                if (html == htmlNow)
                    break;

                html = htmlNow;
            }

            token.ThrowIfCancellationRequested();
            return html;
        }

        static void SetFeatureBrowserEmulation()
        {
            if (LicenseManager.UsageMode != LicenseUsageMode.Runtime)
                return;
            var appName = System.IO.Path.GetFileName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
            Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
                appName, 10000, RegistryValueKind.DWord);
        }
    }
}</code>
這種方法提供了一種更全面、更有效率的方法來提取動態產生的內容.NET 應用程式中來自Web 瀏覽器的HTML 內容。

以上是如何透過 .NET WebBrowser 有效檢索動態產生的 HTML?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn