首页 >后端开发 >C++ >如何从 WebBrowser 控件中的框架和 IFrame 中提取 HtmlElements?

如何从 WebBrowser 控件中的框架和 IFrame 中提取 HtmlElements?

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 控件从特定网站收集视频剪辑链接时,网页包含 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