Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mendapatkan Nilai HtmlElement dari Dalam Bingkai/IFrames dalam Kawalan Pelayar Web WinForms?
Mengekstrak Pautan Video daripada Nested IFrames dalam WinForms WebBrowser
Pautan video mengikis web menggunakan kawalan WinForms WebBrowser
memberikan cabaran apabila berurusan dengan iframe bersarang. Pendekatan standard selalunya gagal untuk mengesan <video>
tag disebabkan oleh struktur iframe.
Penyelesaian: Rekursif IFrame Traversal
Kuncinya ialah melintasi hierarki iframe secara rekursif. Setiap iframe mempunyai HtmlDocument
sendiri, memerlukan kaedah untuk menavigasi dan mengekstrak data daripada setiap tahap bersarang.
Memanfaatkan DocumentCompleted
Acara
Untuk memastikan halaman dimuatkan sepenuhnya sebelum menghuraikan, langgan acara DocumentCompleted
. Hanya memproses iframe sekali ReadyState
ialah WebBrowserReadyState.Complete
.
Contoh Pelaksanaan (Peningkatan Pengendalian Ralat dan Kejelasan)
Kod berikut menyediakan penyelesaian yang mantap, menggabungkan pengendalian ralat yang lebih baik dan nama pembolehubah yang lebih jelas:
<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>
Kod yang dipertingkatkan ini secara rekursif memanggil ExtractVideoLinks
untuk setiap iframe, mengendalikan kemungkinan pengecualian dengan anggun. Ia juga termasuk semakan untuk atribut src
null atau kosong dan pautan video pendua. Pendekatan ini memastikan pengekstrakan pautan video yang lebih dipercayai dan lengkap daripada halaman web yang kompleks.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Nilai HtmlElement dari Dalam Bingkai/IFrames dalam Kawalan Pelayar Web WinForms?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!