Heim > Backend-Entwicklung > C++ > Wie kann ich dynamisch generiertes HTML mit dem WebBrowser von .NET und mshtml.HTMLDocument effizient abrufen?

Wie kann ich dynamisch generiertes HTML mit dem WebBrowser von .NET und mshtml.HTMLDocument effizient abrufen?

DDD
Freigeben: 2025-01-15 12:06:16
Original
188 Leute haben es durchsucht

How to Efficiently Retrieve Dynamically Generated HTML Using .NET's WebBrowser and mshtml.HTMLDocument?

Extrahieren von dynamisch generiertem HTML mit dem WebBrowser von .NET und mshtml.HTMLDocument

Das Abrufen dynamisch generierter HTML-Inhalte stellt eine Herausforderung dar, wenn .NETs WebBrowser oder mshtml.HTMLDocument einzeln verwendet werden. Eine überlegene Methode kombiniert beides, wie im folgenden Codebeispiel gezeigt:

<code class="language-csharp">using Microsoft.Win32;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        // Initiate the asynchronous HTML retrieval
        async void MainForm_Load(object sender, EventArgs e)
        {
            try
            {
                var cts = new CancellationTokenSource(10000); // 10-second timeout
                var html = await LoadDynamicPage("https://www.google.com/#q=where+am+i", cts.Token);
                MessageBox.Show(html.Substring(0, 1024) + "..." ); // Display a truncated result
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        // Asynchronous function to retrieve the HTML content
        async Task<string> LoadDynamicPage(string url, CancellationToken token)
        {
            // Navigate and wait for DocumentCompleted event
            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 page load
                }
                finally
                {
                    this.webBrowser.DocumentCompleted -= handler;
                }
            }

            // Get the root HTML element
            var documentElement = this.webBrowser.Document.GetElementsByTagName("html")[0];

            // Asynchronously poll for HTML changes
            string html = documentElement.OuterHtml;
            while (true)
            {
                // Wait asynchronously (cancellation possible)
                await Task.Delay(500, token);

                // Continue polling if the browser is busy
                if (this.webBrowser.IsBusy)
                    continue;

                string htmlNow = documentElement.OuterHtml;
                if (html == htmlNow)
                    break; // No changes, exit loop

                html = htmlNow;
            }

            // Check for cancellation
            token.ThrowIfCancellationRequested();
            return html;
        }

        // Enable HTML5 emulation (for IE10+)
        // More details: https://stackoverflow.com/a/18333982/1768303
        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>
Nach dem Login kopieren

Dieser Code verwendet das WebBrowser zum Navigieren und das DocumentCompleted-Ereignis zum ersten Laden der Seite. Anschließend wird ein asynchroner Abfragemechanismus (Task.Delay()) verwendet, um Änderungen in der Eigenschaft OuterHtml zu überwachen. Die Schleife wird beendet, wenn keine weiteren Änderungen erkannt werden und der Browser inaktiv ist, und gibt den vollständig gerenderten HTML-Code zurück. Dieser robuste Ansatz verarbeitet effektiv dynamische Webinhalte.

Das obige ist der detaillierte Inhalt vonWie kann ich dynamisch generiertes HTML mit dem WebBrowser von .NET und mshtml.HTMLDocument effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage