Bagaimana untuk Dapatkan Kod HTML Dijana Secara Dinamik Menggunakan .NET tanpa Had?

Linda Hamilton
Lepaskan: 2024-10-18 08:40:03
asal
854 orang telah melayarinya

How to Retrieve Dynamically Generated HTML Code Using .NET without Limitations?

Bagaimana untuk Menjana Kod HTML Secara Dinamik Menggunakan .NET's WebBrowser atau mshtml.HTMLDocument?

Pengenalan

Mendapatkan semula kod HTML secara dinamik yang dihasilkan oleh halaman web adalah tugas biasa dalam automasi web dan senario mengikis. .NET menyediakan dua pilihan untuk mencapai ini: kelas System.Windows.Forms.WebBrowser dan antara muka mshtml.HTMLDocument. Walau bagaimanapun, penggunaannya secara berkesan boleh mencabar.

Kelas Penyemak Imbas Web

Kelas System.Windows.Forms.WebBrowser direka untuk membenamkan halaman web dalam aplikasi anda. Walaupun ia menyokong navigasi tersuai dan acara dokumen, ia terhad dalam keupayaannya untuk menangkap HTML yang dijana secara dinamik.

Coretan kod berikut menggambarkan menggunakan WebBrowser:

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

namespace WebBrowserTest
{
    public class Program
    {
        public static void Main()
        {
            WebBrowser wb = new WebBrowser();
            wb.Navigate("https://www.google.com/#q=where+am+i");

            wb.DocumentCompleted += delegate(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)wb.Document.DomDocument;
                foreach (IHTMLElement element in doc.all)
                {
                    System.Diagnostics.Debug.WriteLine(element.outerHTML);
                }
            };
            Form f = new Form();
            f.Controls.Add(wb);
            Application.Run(f);
        }
    }
}</code>
Salin selepas log masuk

mshtml.HTMLDocument Antara muka

Antara muka mshtml.HTMLDocument menyediakan akses terus kepada objek dokumen HTML yang mendasari. Walau bagaimanapun, ia memerlukan navigasi dan pemaparan manual, menjadikannya kurang mudah untuk kandungan yang dijana secara dinamik.

Coretan kod berikut menggambarkan menggunakan mshtml.HTMLDocument:

<code class="csharp">using mshtml;

namespace HTMLDocumentTest
{
    public class Program
    {
        public static void Main()
        {
            mshtml.IHTMLDocument2 doc = (mshtml.IHTMLDocument2)new mshtml.HTMLDocument();
            doc.write(new System.Net.WebClient().DownloadString("https://www.google.com/#q=where+am+i"));

            foreach (IHTMLElement e in doc.all)
            {
                System.Diagnostics.Debug.WriteLine(e.outerHTML);
            }
        }
    }
}</code>
Salin selepas log masuk

Pendekatan Lebih Teguh

Untuk mengatasi pengehadan WebBrowser dan mshtml.HTMLDocument, anda boleh menggunakan pendekatan berikut:

  1. Buat kawalan WebBrowser.
  2. Navigasi ke sasaran URL dan kendalikan acara DocumentCompleted untuk mendapatkan objek mshtml.HTMLDocument2 yang mendasari.
  3. Gunakan gabungan tinjauan pendapat dan semak WebBrowser.IsBusy untuk mengesan apabila halaman telah selesai dipaparkan.
  4. Dapatkan akarnya elemen dan tinjauan sifat OuterHtmlnya sehingga ia menjadi stabil.

Kod Contoh

Kod C# berikut menunjukkan pendekatan ini:

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

namespace DynamicHTMLFetcher
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            this.webBrowser.DocumentCompleted += WebBrowser_DocumentCompleted;
            this.Load += MainForm_Load;
        }

        private 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);
            }
        }

        private 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; // no changes detected, end the poll loop
                html = htmlNow;
            }

            token.ThrowIfCancellationRequested();
            return html;
        }

        private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // Intentional no-op handler, we receive the DocumentCompleted event in the calling method.
        }
    }
}</code>
Salin selepas log masuk

Pendekatan ini memastikan anda memperoleh kod HTML yang diberikan sepenuhnya walaupun ia dijana secara dinamik.

Atas ialah kandungan terperinci Bagaimana untuk Dapatkan Kod HTML Dijana Secara Dinamik Menggunakan .NET tanpa Had?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!