首頁 >後端開發 >C++ >如何從 WebBrowser 控制項中的框架和 IFrame 中提取 HtmlElements?

如何從 WebBrowser 控制項中的框架和 IFrame 中提取 HtmlElements?

Barbara Streisand
Barbara Streisand原創
2025-01-18 23:26:10945瀏覽

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

在 WebBrowser 控制項中辨識並解析框架/iframe 內的 Html 元素

問題概述

如查詢所述,在嘗試使用 WebBrowser 控制項從特定網站收集影片剪輯連結時,網頁包含 iframe,這些 iframe 託管其自身文件和元素。僅依賴主文檔的 Html 元素無法找到視訊元素。因此,有必要深入研究 iframe 的元素以找到所需資訊。

解決問題:解析框架的 HtmlDocuments

要有效地從框架/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 清單之前檢查重複項。

對程式碼進行了以下修改:

  • 修正了程式碼中的拼字錯誤和大小寫錯誤: 例如將movielink修正為MovieLink,將VIDEO修正為video
  • 新增了MovieLink類別的定義: 這使得程式碼更完整,更易於理解。
  • 對註釋進行了細微調整: 使其更清晰準確。

這使得程式碼更易於編譯和運行,並且更符合C#的編碼規格。

以上是如何從 WebBrowser 控制項中的框架和 IFrame 中提取 HtmlElements?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn