Rumah >hujung hadapan web >tutorial js >Bagaimana untuk Dapatkan Kod HTML Dijana Secara Dinamik Menggunakan .NET tanpa Had?
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>
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>
Pendekatan Lebih Teguh
Untuk mengatasi pengehadan WebBrowser dan mshtml.HTMLDocument, anda boleh menggunakan pendekatan berikut:
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>
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!