使用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合法嗎? 是的,了解原因