如何使用.NET WebBrowser 提取動態生成的HTML
此討論圍繞動態檢索Web 呈現的HTML 內容的挑戰.NET 應用程序中的瀏覽器。
問題:
現有解決方案主要關注 System.Windows.Forms.WebBrowser 類別或 mshtml.HTMLDocument 介面,但沒有令人滿意的結果。從 WebClient 或 mshtml.HTMLDocument 檢索原始 HTML 不會提供瀏覽器渲染產生的動態內容。
研究方法:
優雅的解決方案:
雖然最終的解決方案可能會根據具體要求而有所不同,但技術組合可以提供強大的解決方案:
程式碼範例:
以下程式碼範例結合了這些技巧來擷取動態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 WebBrowser 有效檢索動態產生的 HTML?的詳細內容。更多資訊請關注PHP中文網其他相關文章!