首页 > 后端开发 > C++ > 如何从 WinForms WebBrowser 控件中的 Frames/IFrames 中检索 HtmlElement 值?

如何从 WinForms WebBrowser 控件中的 Frames/IFrames 中检索 HtmlElement 值?

Mary-Kate Olsen
发布: 2025-01-18 23:12:41
原创
608 人浏览过

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

从 WinForms WebBrowser 中的嵌套 IFrame 中提取视频链接

使用 WinForms WebBrowser 控件抓取视频链接在处理嵌套 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 属性以及重复的视频链接。 这种方法可确保从复杂网页中更可靠、更完整地提取视频链接。

以上是如何从 WinForms WebBrowser 控件中的 Frames/IFrames 中检索 HtmlElement 值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板