HtmlAgilityPack extrait le texte de tous les divs d'une page et pas seulement de celui spécifié dans le code

c# html-agility-pack

Question

J'ai un comportement étrange avec une expression xpath avec HtmlAgilityPack. J'essaie d'utiliser HtmlAgilityPack pour extraire toutes les valeurs d'un div déclaré comme <div class='cont'> Cependant, lorsque j'utilise le code ci-dessous, j'obtiens simplement toutes les valeurs contenues dans <div class='cont'> AND <div class='button'> . Est-ce que quelqu'un sait pourquoi cela se passe? Voici le code complet pour le reproduire:

using System;
using System.Xml.XPath;
using HtmlAgilityPack;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            const string text1 = @"<div class=""cont"">
<h3>content</h3> 
<div style=""margin: 0cm 0cm 0pt"" class=""Normal"">content1</div><div style=""margin: 0cm 0cm 0pt"" class=""Normal""> content2</div>
<div style=""margin: 0cm 0cm 0pt"" class=""Normal"">content3 </div>
<div>content4 </div><strong>content5
<div>content6 </div><ul type=""disc"">    
<div>content7 </div>        
<div>content8 </div>    </ul>
<p class='margin10'><font size=""2"">
<div>
<p><span style=""font-family: Arial"">content9</span></p>
</div>
<div>content10</font><a href=""mailto:james@polis.com""><u><font color=""#0000ff"" size=""2""><font color=""#0000ff"" size=""2""> content11 </u></font></font></a><font size=""2""> content12
<div>content13</div>
</div>
</font>
</p>
</div>
<div class=""button"">
<span class=""applybtn""><a class=""buttonGlobal buttonAlpha"" href=""/uk/job/apply/(id)/608735"">content14</a></span>
</div>";
            foreach (XPathNavigator node in SearchInPage(text1, "//div[@class='cont']"))
            {
                Console.WriteLine("option " + node.Value);
            }

        }

        private static XPathNodeIterator SearchInPage(string text, string xpath)
        {
            HtmlDocument htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(text);
            XPathNavigator xpathNavigator = htmlDocument.CreateNavigator();
            XPathNodeIterator nodes = xpathNavigator.Select(xpath);
            return nodes;
        }
    }
}

Le code retourne: 'content', 'content1-13' PLUS 'content14' qui existe dans <div class='button'>

Réponse populaire

Donc, si je comprends bien, vous voulez trouver la valeur uniquement pour les nœuds enfants du nœud <div class="cont"> ?

Essaye ça:

HtmlDocument doc = new HtmlDocument;
doc.Load(Html);
HtmlNode node = doc.DocumentNode.SelectSingleNode(".//div[@class='cont']");

foreach(HtmlNode childNode in node)
{
    Console.WriteLine(childNode.Value);
}

Je n'ai aucun moyen de résoudre ce problème devant moi, mais cela devrait fonctionner. le (".//div[@class='cont']") ne doit sélectionner que le nœud spécifié et ses enfants, et ignorer tout ce qui vit en dehors du nœud spécifié. Le reste n’est que Linq et HtmlAgilityPack - Rappelez-vous, HtmlAgilityPack implémente XPath, alors assurez-vous de parcourir les méthodes disponibles d’AgilityPacks avant d’utiliser XPath ... rappelez-vous que xml et html sont des langages différents, et que cela ne fonctionne pas nécessairement pour le premier. autre.




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