Heim >Backend-Entwicklung >C++ >Wie rufe ich HtmlElement-Werte aus Frames/IFrames in einem WinForms-WebBrowser-Steuerelement ab?

Wie rufe ich HtmlElement-Werte aus Frames/IFrames in einem WinForms-WebBrowser-Steuerelement ab?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-18 23:12:41704Durchsuche

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

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 DocumentCompletedEvents

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn