如何获取 Frames/IFrames 内的 HtmlElement 值?

2023-12-21

我正在使用Winforms WebBrowser控制从下面链接的网站收集视频剪辑的链接。

LINK http://www.fuoriditesta.it/video-divertenti/marito-ubriaco-prende-la-moglie-in-braccio-ma-combina-un-disastro.html

但是,当我逐个滚动元素时,我找不到<video> tag.

void webBrowser_DocumentCompleted_2(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    try
    {
        HtmlElementCollection pTags = browser.Document.GetElementsByTagName("video");
        int i = 1;
        foreach (HtmlElement link in links)
        {

            if (link.Children[0].GetAttribute("className") == "vjs-poster")
            {
                try
                {

                    i++;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }   // Added by edit
}

使用后不久

HtmlElementCollection pTags = browser.Document.GetElementsByTagName("video");

我已经返回0了

我需要调用ajax吗?


您链接的网页包含IFrames https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.htmlwindow.frames.
An IFrame包含它自己的Html文档 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.htmlwindow.document。到目前为止,您仅解析主文档容器。
因此,您需要解析HtmlElements其他一些标签Frame.
网页框架列表由WebBrowser.Document.Window.Frames https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.htmlwindow.frames属性,它返回一个HtmlWindow集合 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.htmlwindowcollection.
Each html窗口 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.htmlwindow集合中包含它自己的HtmlDocument object.

而不是解析Document由 a 返回的对象属性WebBrowser,大多数时候,我们需要解析每个HtmlWindow.Document in the Frames收藏;当然,除非我们已经知道所需的元素是主文档或其他已知元素的一部分Frame.

示例(与当前任务相关):

  • 订阅文件已完成 https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.documentcompleted?view=netframework-4.7.2Web 浏览器控件/类的事件。
  • 检查WebBrowser.ReadyState https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.webbrowser.readystate?view=netframework-4.7.2属性来验证文档是否已完全加载。

Note:
请记住,一个网页可能由包含在 Frames/IFrames 中的多个文档组成,如果使用某个事件多次引发该事件,我们不会感到惊讶。ReadyState = WebBrowserReadyState.Complete.
每一帧的Document将引发该事件时WebBrowser已完成加载。

  • 解析HtmlDocument中每一帧的Document.Window.Frames集合,使用Frame.Document.Body.GetElementsByTagName() https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.htmlelement.getelementsbytagname method.
  • 提取HtmlElements Attibute使用HtmlElement.GetAttribute https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.htmlelement.getattribute method.

Note:
自从DocumentCompleted事件被多次引发,我们需要验证HtmlElement属性值也不会被多次存储。
在这里,我使用一个支持自定义类,它保存所有收集的值以及每个引用链接的 HashCode(这里依赖于默认实现)GetHasCode()).
每次解析文档时,我们都会检查一个值是否已被存储,并比较其哈希值。

  • 当我们验证已找到重复的哈希时,停止解析:框架文档元素已被提取。

Note:
在解析时HtmlWindowCollection,不可避免地要提出一些具体的异常:

  1. 未经授权的访问异常 https://learn.microsoft.com/en-us/dotnet/api/system.unauthorizedaccessexception:某些框架无法访问。
  2. 无效操作异常 https://learn.microsoft.com/en-us/dotnet/api/system.invalidoperationexception:某些元素/后代无法访问。

我们无法避免这种情况:元素不是null,当我们尝试访问时,它们只是抛出这些异常any他们的财产。
在这里,我只是捕获并忽略这些特定的异常:我们知道我们最终会得到它们,我们无法避免它,继续前进。

public class MovieLink
{
    public MovieLink() { }
    public int Hash { get; set; }
    public string VideoLink { get; set; }
    public string ImageLink { get; set; }
}

List<MovieLink> moviesLinks = new List<MovieLink>();

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.Children[0].GetAttribute("src");
                int hash = videoLink.GetHashCode();
                if (moviesLinks.Any(m => m.Hash == hash)) {
                    // Done parsing this URL: remove handler or whatever 
                    // else is planned to move to the next site/page
                    return;
                }

                string sourceImage = videoElement.GetAttribute("poster");
                moviesLinks.Add(new MovieLink() {
                    Hash = hash, VideoLink = videoLink, ImageLink = sourceImage
                });
            }
        }
        catch (UnauthorizedAccessException) { } // Cannot be avoided: ignore
        catch (InvalidOperationException) { }   // Cannot be avoided: ignore
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取 Frames/IFrames 内的 HtmlElement 值? 的相关文章

  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 假装 .NET 字符串是值类型

    在 NET 中 字符串是不可变的 并且是引用类型变量 这通常会让新的 NET 开发人员感到惊讶 因为他们的行为可能会将它们误认为是值类型对象 然而 除了使用实践StringBuilder对于长连接 尤其是 在循环中 在实践中是否有任何理由需
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names

随机推荐

  • 从服务器,如何识别 javascript fetch() 调用(asp.net mvc)

    这并不完全是重复的 下面提供的答案与提议的重复答案中的评论相同 从 asp net 控制器操作内部 我有兴趣了解该调用是否是由 javascript fetch 调用进行的 我可以询问 Request 对象的任何部分来发现这一点吗 例如 如
  • 我应该为 PayPal 沙盒使用什么用户名/密码/签名?

    我正在尝试使用 Paypal NVP API 退款交易 我在沙盒帐户中收到了一些付款 但是当我尝试通过 API 发放退款时 我得到了You do not have permissions to make this API call 但我不确
  • 使用 AVPlayer-Swift 无缝循环视频

    我正在使用 AVPlayer 在后台循环播放本地视频 视频播放正常 但完成视频后需要暂停才能循环播放视频 我尝试了很多方法 也看到了很多关于堆栈溢出的帖子 但我未能找到合适的解决方案 我正在使用 Swift3 代码在这里 var video
  • 使用 openxlsx 导入多个 Excel 工作表

    我正在尝试将一个大型 xlsx 文件导入到包含许多数据表的 R 中 我试图通过这样做XLConnect 但是java内存问题 比如描述的那些在这个线程中 https stackoverflow com questions 21937640
  • 当应用程序处于后台时,单击通知时不会调用 fcm.onNotification()

    我已经安装了 cordova plugin fcm 除了一件小事外 一切正常 当应用程序处于后台 关闭并且从 firebase 发送推送通知时 通知会在设备中弹出 单击托盘中的该通知后 我的应用程序开始运行 但控件未进入 fcm onNot
  • 将 HTML 表导出到 Excel 时编码 UTF-8

    我正在尝试使用 javascript 将 HTML 表导出到 Excel 这是 JavaScript 代码
  • while 循环不会以逻辑条件终止

    如果我添加 OR 条件语句 该循环将不会终止 如果其中一个为假 那么它应该终止 全局变量 int x 100 char n malloc 64 void add void do printf Would you like to add 1
  • 100vw DIV 未显示全宽

    我正在努力让灰色div id ex home bottom container 朝向本页底部http patrickbaker biz starter d http patrickbaker biz starter d 整页的宽度 这意味着
  • 在 woocommerce_get_price_html 挂钩中的价格后添加多语言文本

    我正在构建一个 WooCommerce 网站并对其进行自定义 从互联网库复制并粘贴代码 我已成功在 woocommerce 产品中添加 自定义价格和自定义文本 以便可以将它们翻译成不同的语言 这是产品页面的外观 https www prim
  • 从 Internet 下载 URL 中具有特定日期时间的图像

    我正在尝试开发一个应用程序 该应用程序将使用生成的 Url 路径从 Web 服务器获取文件 网络服务器上每秒都会创建一个新文件 我正在尝试访问该文件并将其显示在 PictureBox 中 旧文件不会被删除 我遇到了一些问题 服务器返回404
  • 使用 linq 检查列表计数是否一致

    州有城市 只有在没有平局的情况下 我才需要拥有大多数城市的州 并列意味着排名前 2 的州拥有相同数量的城市 var stateWithMostCities states OrderByDescending p gt p cities Cou
  • 未找到 PHP 类 DateTime

    声明 DateTime 对象时缺少某些内容PHP 5 3 8 我得到一个带有确定日期时间的 JSON 字符串 该字符串被传递到我的 php 控制器 由于某种原因 我没有将其映射为 php 中的 DateTime 对象 但有点奇怪 请参阅以下
  • 转换为 YUV / YCbCr 色彩空间 - 许多版本

    有许多不同的 YUV 颜色转换 但它们都有不同的结果 哪一个是官方正确的 这是我的测试程序的输出 我输入 R 128 G 50 B 50 最大值为 255 该表显示了转换后的 YUV 值和重新转换后的 RGB 值 与原始值不匹配 Colou
  • Javascript d3 从 csv 读取

    好的 所以我对 javascript 有点菜鸟 我需要从 csv 读取数据以使用 d3 制作条形图 条形图对我来说没有问题 从 csv 文件中读取是问题 这是我的代码 var dataset d3 csv gender ratio csv
  • 如何在 keycloak docker 容器中进行数据库备份

    我使用 docker 安装了 keycloakdjango project docker run p 8080 8080 e KEYCLOAK USER admin e KEYCLOAK PASSWORD admin jboss keycl
  • 如何将属性绑定到WPF中Treeview中选定的节点

    如何将自定义属性绑定到MVVM中选定节点的IsSelected属性 我已在运行时将节点加载到树视图中 我正在使用MVVM 这是一个小例子 public abstract class ViewModel INotifyPropertyChan
  • 记住 WPF DataGrid 排序顺序

    这是一个延续这个问题 https stackoverflow com questions 34661767 binding properties width sorting of datagrid on dynamic tabpage 1
  • 如何让HTTP连接在一段时间后超时/断开?

    我是阿帕奇的新手HttpClient 我使用以下代码来获取一定时间间隔后的HTTP连接超时 断开连接 PostMethod method new PostMethod authURL HttpClient client new HttpCl
  • Symfony2 SwiftMailer 无法与主机 smtp.gmail.com 建立连接

    在阅读并测试了很多解决方案后 我仍然收到此错误 我的参数 yml parameters database host 127 0 0 1 database port null database name symfony database us
  • 如何获取 Frames/IFrames 内的 HtmlElement 值?

    我正在使用Winforms WebBrowser控制从下面链接的网站收集视频剪辑的链接 LINK http www fuoriditesta it video divertenti marito ubriaco prende la mogl