從 WinForms WebBrowser 中的嵌套 IFrame 中提取視訊連結
使用 WinForms WebBrowser
控制抓取視訊連結在處理嵌套 iframe 時面臨挑戰。 由於 iframe 結構,標準方法通常無法定位 <video>
標籤。
解決方案:遞迴 IFrame 遍歷
關鍵是遞歸遍歷iframe層次結構。 每個 iframe 都有自己的 HtmlDocument
,需要一種方法來導航並從每個嵌套層級提取資料。
利用DocumentCompleted
活動
為了確保頁面在解析之前完全加載,請訂閱 DocumentCompleted
事件。 僅在 ReadyState
為 WebBrowserReadyState.Complete
時處理 iframe。
範例實作(改進的錯誤處理和清晰度)
以下程式碼提供了一個強大的解決方案,結合了改進的錯誤處理和更清晰的變數名稱:
<code class="language-csharp">public class MovieLink { public int Hash { get; set; } public string VideoLink { get; set; } public string ImageLink { get; set; } } private List<MovieLink> movieLinks = new List<MovieLink>(); private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return; ExtractVideoLinks(webBrowser1.Document); } private void ExtractVideoLinks(HtmlDocument document) { try { foreach (HtmlElement videoElement in document.GetElementsByTagName("video")) { string videoLink = videoElement.GetAttribute("src"); if (string.IsNullOrEmpty(videoLink)) continue; //Skip if src is missing int hash = videoLink.GetHashCode(); if (movieLinks.Any(m => m.Hash == hash)) continue; //Skip duplicates string posterImage = videoElement.GetAttribute("poster"); movieLinks.Add(new MovieLink { Hash = hash, VideoLink = videoLink, ImageLink = posterImage }); } // Recursively process iframes foreach (HtmlWindow frame in document.Window.Frames) { ExtractVideoLinks(frame.Document); } } catch (Exception ex) { // Log the exception for debugging purposes. Don't let one iframe failure halt the entire process. Console.WriteLine($"Error processing iframe: {ex.Message}"); } }</code>
此改進的程式碼為每個 iframe 遞歸呼叫 ExtractVideoLinks
,優雅地處理潛在的異常。 它還包括檢查 null 或空 src
屬性以及重複的視訊連結。 這種方法可確保從複雜網頁中更可靠、更完整地提取影片連結。
以上是如何從 WinForms WebBrowser 控制項中的 Frames/IFrames 檢索 HtmlElement 值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!