Maison >développement back-end >C++ >Comment récupérer les valeurs HtmlElement à partir de frames/IFrames dans un contrôle WinForms WebBrowser ?
Extraction de liens vidéo à partir d'IFrames imbriqués dans le navigateur Web WinForms
Les liens vidéo de scraping Web à l'aide du contrôle WinForms WebBrowser
présentent des défis lorsqu'il s'agit de traiter des iframes imbriquées. L'approche standard ne parvient souvent pas à localiser les balises <video>
en raison de la structure iframe.
La solution : traversée récursive d'IFrame
La clé est de parcourir de manière récursive la hiérarchie iframe. Chaque iframe a son propre HtmlDocument
, nécessitant une méthode pour parcourir et extraire les données de chaque niveau imbriqué.
Tirer parti de l'DocumentCompleted
événement
Pour vous assurer que la page est entièrement chargée avant l'analyse, abonnez-vous à l'événement DocumentCompleted
. Ne traitez les iframes qu'une seule fois ReadyState
est WebBrowserReadyState.Complete
.
Exemple de mise en œuvre (gestion des erreurs et clarté améliorées)
Le code suivant fournit une solution robuste, intégrant une gestion améliorée des erreurs et des noms de variables plus clairs :
<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>
Ce code amélioré appelle récursivement ExtractVideoLinks
pour chaque iframe, gérant les exceptions potentielles avec élégance. Il inclut également des vérifications des attributs src
nuls ou vides et des liens vidéo en double. Cette approche garantit une extraction plus fiable et complète des liens vidéo à partir de pages Web complexes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!