extraire tous les tags iframe en utilisant htmlagilitypack

c# html html-agility-pack

Question

J'utilise htmlagilitypack pour extraire plusieurs balises HTML. Heres ce que je fais:

        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

Où decodedHTML est la page HTML empaquetée dans une chaîne. Après cela, j'examine si les variables ci-dessus sont nulles

        if (anchor_tags != null)
        {
            ExtractLinks_AnchorTags(anchor_tags);
        }
        if(audio_tags != null)
        {
            ExtractLinks_AudioTags(audio_tags);
        }
        if(embed_tags!=null)
        {
            ExtractLinks_EmbedTags(embed_tags);
        }
        if (iframe_tags != null)
        {
            ExtractLinks_iFrameTags(iframe_tags);
        }
        if (img_tags != null)
        {
            ExtractLinks_ImgTags(img_tags);
        }
        if (object_tags != null)
        {
            ExtractLinks_ObjectTags(object_tags);
        }
        if (video_tags != null)
        {
            ExtractLinks_ObjectTags(video_tags);
        }

et certaines d'entre elles sont définitivement nulles, car la plupart des méthodes extractLinks ne sont même pas appelées. Par exemple, lorsque je visite youtube. com. Il existe plusieurs tags iframe et le code ne les reconnaît pas.

modifier:

lorsque je supprime "[@" + HTML.TAG_IFRAME_SRC + "]" les iframes sont reconnus, mais je veux simplement extraire ces iframes avec un attribut src. Quelle est la syntaxe correcte pour xpath?

Réponse acceptée

HtmlAgilityPack ne charge pas le contenu des éléments iframe .

Pour inspecter le contenu d'un iframe , lisez l'attribut src (qui représente l'URI de l' iframe ) et exécutez une demande Web distincte pour le charger dans un document HtmlDocument distinct.

En chemin, soyez conscient de ces problèmes possibles:

  • l'attribut src peut contenir un URI relatif. Par exemple, si vous visitez http://www.example.com et constatez qu'un iframe a src="/samplePage" , vous devez d'abord le convertir en un URI absolu (dans ce cas, http://www.example.com/samplePage )

  • il est possible que certains éléments iframe n'aient pas de balise src , car celle-ci est ajoutée dynamiquement, via javascript, lorsque le document est rendu dans un navigateur. Il est également possible de créer des éléments iframe entiers avec javascript, des éléments que vous ne verriez même pas si vous ne faites qu'un HttpWebRequest normal. Dans de tels cas, vous devez analyser le javascript présent sur la page et dupliquer cette logique dans votre programme.

Mettre à jour

L'expression XPath des éléments iframe ayant un attribut src est: //iframe[@src]



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi