Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Cekap Mendapatkan HTML Dijana Secara Dinamik Menggunakan .NET's WebBrowser dan mshtml.HTMLDocument?

Bagaimana untuk Cekap Mendapatkan HTML Dijana Secara Dinamik Menggunakan .NET's WebBrowser dan mshtml.HTMLDocument?

DDD
Lepaskan: 2025-01-15 12:06:16
asal
188 orang telah melayarinya

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

Mengekstrak HTML Dijana Secara Dinamik menggunakan .NET's WebBrowser dan mshtml.HTMLDocument

Mengambil kandungan HTML yang dijana secara dinamik memberikan cabaran apabila menggunakan WebBrowser atau mshtml.HTMLDocument .NET secara individu. Kaedah unggul menggabungkan kedua-duanya, seperti yang ditunjukkan dalam contoh kod di bawah:

<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>
Salin selepas log masuk

Kod ini menggunakan WebBrowser untuk menavigasi dan acara DocumentCompleted untuk pemuatan halaman awal. Ia kemudiannya menggunakan mekanisme pengundian tak segerak (Task.Delay()) untuk memantau perubahan dalam harta OuterHtml. Gelung ditamatkan apabila tiada perubahan selanjutnya dikesan dan penyemak imbas melahu, mengembalikan HTML yang diberikan sepenuhnya. Pendekatan teguh ini mengendalikan kandungan web dinamik dengan berkesan.

Atas ialah kandungan terperinci Bagaimana untuk Cekap Mendapatkan HTML Dijana Secara Dinamik Menggunakan .NET's WebBrowser dan mshtml.HTMLDocument?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan