estraendo tutti i tag iframe usando htmlagilitypack

c# html html-agility-pack

Domanda

Sto usando htmlagilitypack per estrarre diversi tag html. Ecco cosa faccio:

        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

Dove decodedHTML è la pagina html in una stringa. Successivamente, esaminerò se le variabili precedenti sono nulle

        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

e alcuni di essi sono definitivamente nulli, perché la maggior parte dei metodi extractLinks non vengono nemmeno chiamati. Ad esempio, quando sto visitando YouTube. com. Ci sono diversi tag iframe e il codice non li riconosce.

modificare:

quando sto cancellando "[@" + HTML.TAG_IFRAME_SRC + "]" gli iframe sono riconosciuti, ma voglio solo estrarre gli iframe con un attributo src. Qual è la sintassi xpath corretta per questo?

Risposta accettata

HtmlAgilityPack non carica il contenuto degli elementi iframe .

Per esaminare il contenuto di un iframe , leggi l'attributo src (che rappresenta l'URI iframe ) ed esegui una richiesta web separata per caricarla in un HtmlDocument separato.

Lungo la strada, sii consapevole di questi possibili problemi:

  • l'attributo src può contenere un URI relativo. Ad esempio, se visiti http://www.example.com e vedi che un iframe ha src="/samplePage" , devi prima convertirlo in un URI assoluto (in questo caso, http://www.example.com/samplePage )

  • è possibile che alcuni elementi iframe non abbiano un tag src , perché viene aggiunto dinamicamente, tramite javascript, quando il documento viene visualizzato in un browser. È anche possibile creare interi elementi iframe con javascript, elementi che non si vedrebbero nemmeno se si HttpWebRequest un normale HttpWebRequest . In casi come questi, devi analizzare il javascript presente sulla pagina e duplicare quella logica nel tuo programma.

Aggiornare

L'espressione XPath per gli elementi iframe che hanno un attributo src è: //iframe[@src]




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché