WinForms WebBrowser 内のネストされた IFrame からビデオ リンクを抽出する
WinForms WebBrowser
コントロールを使用した Web スクレイピング ビデオ リンクでは、ネストされた iframe を処理する際に課題が生じます。 標準的なアプローチでは、iframe 構造が原因で <video>
タグを見つけることができないことがよくあります。
解決策: 再帰的 IFrame トラバーサル
重要なのは、iframe 階層を再帰的に横断することです。 各 iframe には独自の HtmlDocument
があり、ネストされた各レベルに移動してデータを抽出するメソッドが必要です。
DocumentCompleted
イベントの活用
解析前にページが完全にロードされていることを確認するには、DocumentCompleted
イベントをサブスクライブします。 ReadyState
が WebBrowserReadyState.Complete
になった場合のみ iframe を処理します。
実装例 (エラー処理と明確さの向上)
次のコードは、改善されたエラー処理とより明確な変数名を組み込んだ、堅牢なソリューションを提供します。
<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>
この改善されたコードは、各 iframe に対して ExtractVideoLinks
を再帰的に呼び出し、潜在的な例外を適切に処理します。 これには、null または空の src
属性と重複したビデオ リンクのチェックも含まれます。 このアプローチにより、複雑な Web ページからビデオ リンクをより確実かつ完全に抽出できます。
以上がWinForms WebBrowser コントロールのフレーム/IFrame 内から HtmlElement 値を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。