使用htmlagilitypack提取所有iframe标签

c# html html-agility-pack

我正在使用htmlagilitypack来提取几个html标签。继承人我做的事:

        HtmlDoc = new HtmlDocument();
        StringReader sr = new StringReader(decodedHTML);
        HtmlDoc.Load(sr);
        sr.close();
        var anchor_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_ANCHOR + "[@" + HTML.ATTRIBUT_HREF + "]");
        var embed_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_EMBED + "[@" + HTML.TAG_EMBED_SRC + "]");
        var iframe_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_IFRAME + "[@" + HTML.TAG_IFRAME_SRC + "]");
        var img_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_IMG + "[@" + HTML.TAG_IMG_SRC + "]");
        var audio_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_AUDIO);       // may contain inner-html
        var object_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_OBJECT);     // may contain inner-html
        var video_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_VIDEO);       // may contain inner-html

其中decodingHTML是打包在字符串中的html页面。之后,我检查上面的变量是否为空

        HtmlDoc = new HtmlDocument();
        StringReader sr = new StringReader(decodedHTML);
        HtmlDoc.Load(sr);
        sr.close();
        var anchor_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_ANCHOR + "[@" + HTML.ATTRIBUT_HREF + "]");
        var embed_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_EMBED + "[@" + HTML.TAG_EMBED_SRC + "]");
        var iframe_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_IFRAME + "[@" + HTML.TAG_IFRAME_SRC + "]");
        var img_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_IMG + "[@" + HTML.TAG_IMG_SRC + "]");
        var audio_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_AUDIO);       // may contain inner-html
        var object_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_OBJECT);     // may contain inner-html
        var video_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_VIDEO);       // may contain inner-html

其中一些肯定是空的,因为甚至没有调用大多数extractLinks方法。例如,当我访问youtube时。 com。有几个iframe标签,代码不识别它们。

编辑:

当我删除"[@" + HTML.TAG_IFRAME_SRC + "]" iframe被识别,但我只想提取带有src属性的iframe。什么是正确的xpath语法?

一般承认的答案

HtmlAgilityPack不加载iframe元素的内容。

为了检查iframe的内容,请读取src属性(表示iframe的URI)并执行单独的Web请求以将其加载到单独的HtmlDocument

一路上,请注意这些可能的问题:

  • src属性可能包含相对URI。例如,如果您访问http://www.example.com并看到iframe具有src="/samplePage" ,则应首先将其转换为绝对URI(在本例中为http://www.example.com/samplePage

  • 有些iframe元素可能没有src标记,因为它是在浏览器中呈现文档时通过javascript动态添加的。也可以使用javascript创建整个iframe元素,如果你只是做一个常规的HttpWebRequest ,你甚至都看不到这些元素。在这种情况下,您必须分析页面上存在的javascript并在程序中复制该逻辑。

更新

具有src属性的iframe元素的XPath表达式为: //iframe[@src]




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因