如何在Frames / IFrames中获取HtmlElement值?

时间:2018-11-08 18:12:54

标签: c# winforms webbrowser-control

我正在使用name Winforms控件从下面链接的站点收集视频剪辑的链接。

LINK

但是,当我逐元素滚动时,找不到WebBrowser标签。

<video>

使用后很快

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
}

我已经返回0

我需要调用任何ajax吗?

1 个答案:

答案 0 :(得分:2)

您链接的网页包含IFrames
IFrame包含自己的HtmlDocument。到目前为止,您只解析主Document容器。
因此,您需要解析其他一些HtmlElements的{​​{1}}标记。
Web页面框架列表由WebBrowser.Document.Window.Frames属性引用,该属性返回一个HtmlWindowCollection
集合中的每个HtmlWindow都包含自己的Frame对象。

大多数时候,我们需要解析HtmlDocument集合中的每个Document,而不是解析WebBrowser返回的HtmlWindow.Document对象属性;除非,当然,除非我们已经知道所需的元素是主文档或另一个已知的Frames的一部分。

一个示例(与当前任务有关):

注意:
记住网页可能由Frames / IFrames中包含的多个Documents组成,如果使用Frame多次引发该事件,我们不会感到惊讶。
ReadyState = WebBrowserReadyState.Complete完成加载后,每个框架的Document将引发事件。

注意:
由于Attibute事件被多次引发,因此我们需要验证DocumentCompleted属性值也没有被多次存储。
在这里,我使用的是一个支持自定义类,该类包含所有收集的值以及每个引用Link的HashCode(在此依赖于HtmlElement的默认实现)。
每次解析Document时,我们都会比较其Hash值来检查是否已经存储了一个值。

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

注意
解析GetHasCode()时,不可避免地会引发一些特定的异常:
1)UnauthorizedAccessException:某些框架无法访问。
2)InvalidOperationException:某些元素/后代无法访问。

我们没有什么可以避免的:元素不是HtmlWindowCollection,当我们尝试访问它们的属性的 any 时,它们只是抛出了这些异常(基类的错误设计) )。
在这里,我只是捕捉并忽略了这些特定的异常:我们知道最终我们会获得它们,我们无法避免,继续前进。

null