Heim >Backend-Entwicklung >C++ >Wie rufe ich HtmlElement-Werte aus Frames/IFrames in einem WinForms-WebBrowser-Steuerelement ab?
Extrahieren von Videolinks aus verschachtelten IFrames im WinForms-WebBrowser
Das Web-Scraping von Videolinks mithilfe des WinForms-WebBrowser
-Steuerelements stellt beim Umgang mit verschachtelten Iframes eine Herausforderung dar. Der Standardansatz findet aufgrund der Iframe-Struktur häufig keine <video>
-Tags.
Die Lösung: Rekursiver IFrame-Traversal
Der Schlüssel liegt darin, die Iframe-Hierarchie rekursiv zu durchlaufen. Jeder Iframe hat sein eigenes HtmlDocument
, was eine Methode zum Navigieren und Extrahieren von Daten aus jeder verschachtelten Ebene erfordert.
Nutzung des DocumentCompleted
Events
Um sicherzustellen, dass die Seite vor dem Parsen vollständig geladen ist, abonnieren Sie das Ereignis DocumentCompleted
. Verarbeiten Sie die Iframes nur einmal, wenn ReadyState
WebBrowserReadyState.Complete
ist.
Beispielimplementierung (verbesserte Fehlerbehandlung und Klarheit)
Der folgende Code bietet eine robuste Lösung, die eine verbesserte Fehlerbehandlung und klarere Variablennamen beinhaltet:
<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>
Dieser verbesserte Code ruft rekursiv ExtractVideoLinks
für jeden Iframe auf und behandelt potenzielle Ausnahmen ordnungsgemäß. Es umfasst auch Prüfungen auf Null- oder leere src
-Attribute und doppelte Videolinks. Dieser Ansatz gewährleistet eine zuverlässigere und vollständigere Extraktion von Videolinks aus komplexen Webseiten.
Das obige ist der detaillierte Inhalt vonWie rufe ich HtmlElement-Werte aus Frames/IFrames in einem WinForms-WebBrowser-Steuerelement ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!