ホームページ >バックエンド開発 >C++ >WebBrowser コントロールのフレームおよび IFrame から HtmlElement を抽出する方法

WebBrowser コントロールのフレームおよび IFrame から HtmlElement を抽出する方法

Barbara Streisand
Barbara Streisandオリジナル
2025-01-18 23:26:10847ブラウズ

How to Extract HtmlElements from Frames and IFrames in WebBrowser Control?

WebBrowser コントロールのフレーム/iframe 内の HTML 要素を識別して解析します

問題の概要

クエリに記載されているように、WebBrowser コントロールを使用して特定の Web サイトからビデオ クリップ リンクを収集しようとすると、Web ページには独自のドキュメントと要素をホストする iframe が含まれます。 video 要素は、メインドキュメントの Html 要素のみに依存して見つけることはできません。したがって、必要な情報を見つけるには、iframe の要素を詳しく調べる必要があります。

問題の解決: フレームの HtmlDocument の解析

フレーム/iframe から HTML 要素を効率的に取得するには、次の手順を実行できます:

1. 識別フレームワーク:

  • WebBrowser.Document.Window.Frames プロパティを使用して、メイン ドキュメント内のすべてのフレームを含む HtmlWindowCollection にアクセスします。

2. フレームワークドキュメントを解析します:

  • コレクション内の各 HtmlWindow を反復処理します。
  • 各フレームについて、その HtmlDocument プロパティにアクセスして、その Html 要素を検査します。

3. HTML 要素の属性を抽出します:

  • HtmlElement.GetAttribute メソッドを使用して、認識された Html 要素から関連する属性を抽出します。

サンプルコードスニペット:

これは、フレームから HTML 要素を解析する方法を示すサンプル実装です:

<code class="language-c#">public class FrameHtmlElementParser
{
    private List<MovieLink> movieLinks = new List<MovieLink>(); //更正变量名

    public void ParseMovies(WebBrowser browser)
    {
        browser.DocumentCompleted += Browser_DocumentCompleted;
    }

    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 (movieLinks.Any(m => m.Hash == hash)) //更正变量名
                    {
                        // 完成此 URL 的解析。删除处理程序或采取其他适当的操作。
                        return;
                    }

                    string sourceImage = videoElement.GetAttribute("poster");
                    movieLinks.Add(new MovieLink //更正变量名
                    {
                        Hash = hash,
                        VideoLink = videoLink,
                        ImageLink = sourceImage
                    });
                }
            }
            catch (UnauthorizedAccessException) { } // 无法避免:忽略
            catch (InvalidOperationException) { }   // 无法避免:忽略
        }
    }
}

public class MovieLink //添加MovieLink类定义
{
    public int Hash { get; set; }
    public string VideoLink { get; set; }
    public string ImageLink { get; set; }
}</code>

重複データを避ける:

HTML 要素の属性が重複して保存されるのを防ぐために、サンプル コードでは、参照される各リンクの HashCode を含むカスタム MovieLink クラスを使用します。 HashCode を比較することにより、新しい項目を movieLinks リストに追加する前に重複がないかチェックします。

コードに次の変更が加えられました:

  • コード内のスペルと大文字の誤りを修正しました: たとえば、movielinkMovieLink に修正され、VIDEOvideo に修正されます。
  • MovieLinkクラス定義を追加しました: これにより、コードがより完全になり、理解しやすくなります。
  • 注釈をより明確かつ正確にするために、 に若干の調整を加えました。

これにより、コードのコンパイルと実行が容易になり、C# コーディング規約との一貫性が高まります。

以上がWebBrowser コントロールのフレームおよび IFrame から HtmlElement を抽出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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