Maison >développement back-end >C++ >Comment extraire des données d'éléments HTML dans des frames et des IFrames ?

Comment extraire des données d'éléments HTML dans des frames et des IFrames ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-18 23:16:12673parcourir

How to Extract Data from HTML Elements Within Frames and IFrames?

Analyser les éléments HTML dans les frames et iframes

Vous rencontrez des difficultés pour trouver la balise <video> lorsque vous essayez d'extraire un lien vidéo du site Web fourni. En effet, le site Web utilise des cadres (iframes), qui isolent efficacement différentes parties du contenu dans des documents HTML distincts.

Pour résoudre ce problème, vous devez fouiller dans la collection de cadres dans le document principal. Chaque cadre contient son propre document HTML et l'accès à ces documents individuels est nécessaire pour extraire les données de toutes les parties du site Web.

Solution :

Utilisez l'attribut WebBrowser.Document.Window.Frames pour accéder à la collection de cadres. Chaque HtmlWindow de cette collection possède son propre objet HtmlDocument.

Modifiez votre code pour parcourir le document de chaque cadre, en utilisant la méthode Frame.Document.Body.GetElementsByTagName() pour récupérer l'élément dont vous avez besoin. Utilisez HtmlElement.GetAttribute pour extraire les attributs des éléments.

Exemple :

<code class="language-csharp">List<MovieLink> moviesLinks = new List<MovieLink>();

private void Browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var browser = sender as WebBrowser;
    if (browser.ReadyState != WebBrowserReadyState.Complete) return;

    var documentFrames = browser.Document.Window.Frames;
    foreach (HtmlWindow frame in documentFrames)
    {
        try
        {
            var videoElement = frame.Document.Body
                .GetElementsByTagName("VIDEO").OfType<HtmlElement>().FirstOrDefault();

            if (videoElement != null)
            {
                string videoLink = videoElement.GetAttribute("src");
                int hash = videoLink.GetHashCode();
                if (moviesLinks.Any(m => m.Hash == hash))
                {
                    return; // 此 URL 的解析已完成
                }

                string sourceImage = videoElement.GetAttribute("poster");
                moviesLinks.Add(new MovieLink()
                {
                    Hash = hash,
                    VideoLink = videoLink,
                    ImageLink = sourceImage
                });
            }
        }
        catch (UnauthorizedAccessException) { } // 忽略此异常
        catch (InvalidOperationException) { } // 忽略此异常
    }
}</code>

Instructions :

  • L'événement DocumentCompleted peut se déclencher plusieurs fois lorsque le navigateur charge chaque document frame.
  • Certains cadres peuvent ne pas être accessibles ou leurs éléments peuvent générer des exceptions lors de l'accès aux propriétés. Ignorez ces exceptions car elles sont inévitables.
  • Utilisez le hachage pour éviter le stockage de liens en double. Lorsqu'une valeur de hachage en double est trouvée, vous pouvez arrêter l'analyse de l'URL.

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