ホームページ >バックエンド開発 >C++ >WinForms WebBrowser コントロールのフレーム/IFrame 内から HtmlElement 値を取得する方法

WinForms WebBrowser コントロールのフレーム/IFrame 内から HtmlElement 値を取得する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-18 23:12:41611ブラウズ

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

WinForms WebBrowser 内のネストされた IFrame からビデオ リンクを抽出する

WinForms WebBrowser コントロールを使用した Web スクレイピング ビデオ リンクでは、ネストされた iframe を処理する際に課題が生じます。 標準的なアプローチでは、iframe 構造が原因で <video> タグを見つけることができないことがよくあります。

解決策: 再帰的 IFrame トラバーサル

重要なのは、iframe 階層を再帰的に横断することです。 各 iframe には独自の HtmlDocument があり、ネストされた各レベルに移動してデータを抽出するメソッドが必要です。

DocumentCompleted イベントの活用

解析前にページが完全にロードされていることを確認するには、DocumentCompleted イベントをサブスクライブします。 ReadyStateWebBrowserReadyState.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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。