Maison >développement back-end >C++ >Comment récupérer les valeurs HtmlElement à partir de frames/IFrames dans un contrôle WinForms WebBrowser ?

Comment récupérer les valeurs HtmlElement à partir de frames/IFrames dans un contrôle WinForms WebBrowser ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-18 23:12:41611parcourir

How to Retrieve HtmlElement Values from Within Frames/IFrames in a WinForms WebBrowser Control?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn