从 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中文网其他相关文章!