栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

您链接的网页包含Iframes。
一个

Iframe
包含它自己的HTMLdocument。到目前为止,您只解析主document容器。
因此,您需要解析
HtmlElements
其他标签
frame

Web页面框架列表由WebBrowser.document.Window.frames属性引用,该属性返回HtmlWindowCollection。集合中的
每个HtmlWindow都包含自己的
Htmldocument
对象。


相反解析的

document
被返回的对象属性
WebBrowser
,我们大部分的时间,需要分析每个
HtmlWindow.document
frames
收集;
除非,当然,除非我们已经知道所需的元素是主文档或其他已知文档的一部分
frame

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

  • 订阅WebBrowser控件/类的documentCompleted事件。

  • 检查WebBrowser.ReadyState属性以验证是否完全加载了document。

注意:
请记住,网页可能是由frames / Iframes中包含的多个document组成的,如果使用多次引发事件,我们不会感到惊讶

ReadyState =WebBrowserReadyState.Complete
。加载完毕后,
每个frame
document
都会引发事件
WebBrowser

  • 使用frame.document.Body.GetElementsByTagName()方法解析集合

    Htmldocument
    中每个frame的。
    document.Window.frames

  • HtmlElements
    Attibute
    使用HtmlElement.GetAttribute方法提取。

注意:
由于

documentCompleted
事件引发多次,因此我们需要验证
HtmlElement
属性值也没有存储多次。
在这里,我使用的是一个支持自定义类,该类包含所有收集的值以及每个引用link的HashCode(此处依赖的默认实现
GetHasCode()
)。
每次解析文档时,我们都会比较其哈希值,以检查是否已存储值。

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

注意
在解析时

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

我们没有什么可以避免的:元素不是

null
,当我们尝试访问它们的 任何 属性(基类的不良设计)时,它们只会抛出这些异常。
在这里,我只是捕捉并忽略了这些特定的例外:我们知道最终将获得它们,我们无法避免,继续前进。

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 webBrowser1_documentCompleted(object sender, WebBrowserdocumentCompletedEventArgs e){    if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;    var documentframes = webBrowser1.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    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/575997.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号