Obtenir une valeur entre les balises html Xpath et HtmlAgility

c# html html-agility-pack html-parsing xpath

Question

Jusqu'à présent, j'essaie de récupérer le texte entre les balises HTML d'un site Web donné ....

Supposons par exemple que je doive extraire le texte entre ces balises span. Comment procéder, je reçois une erreur indiquant que "la référence de l'objet n'est pas définie sur une instance d'objet", voici le code HTML

Il existe également un code HTML antérieur à cette partie ici; Je ne sais pas si cela devrait faire une différence.

<div class="thumbnail-details">
<ul>
    <li> … </li>
    <li class="product-title">
        <span class="thumbnail-details-grey">The Blaster Portable Wireless Speaker in Black</span>
    </li>
    <li> … </li>
</ul>
</div>

Jusqu'à présent, mon code C # est

    HtmlWeb hw = new HtmlWeb();
        HtmlAgilityPack.HtmlDocument htmlDoc = hw.Load(@"http://www.karmaloop.com/Browse.htm#Pgroup=1");
        if (htmlDoc.DocumentNode != null)
        {
            foreach (HtmlNode text in htmlDoc.DocumentNode.SelectNodes("//span[@class='thumbnail-details-grey']/text()"))
            {
                Console.WriteLine(text.InnerText);
            }

Puis-je obtenir de l'aide ici, je veux extraire "le haut-parleur sans fil portable Blaster en noir". Toute aide sera utile, merci d'avance.

Réponse acceptée

Votre code fonctionne très bien, mais vous devrez charger la bonne page pour le faire fonctionner. La page que vous chargez utilise une demande ajax pour charger les résultats que vous voyez dans votre navigateur.

Donc, au lieu de l'URL que vous utilisez actuellement, vous devez utiliser:

HtmlDocument htmlDoc = hw.Load(@"http://www.karmaloop.com/Browse?Pgroup=1&ajax=true&version=2");

Ensuite, votre code fonctionne. Je cherche toujours l'endroit où cette demande est mise en place ...

Mais la requête semble plutôt facile à deviner. Par exemple, la page http://www.karmaloop.com/Browse.htm#Pdept=11&PageSize=30&Pgroup=1 demander l'URL http://www.karmaloop.com/Browse?Pdept=11&PageSize=30&Pgroup=1&ajax=true&version=2 Donc, tout ce que vous avez à faire est d’utiliser votre URL et d’en construire une nouvelle en commençant après le # .


Réponse populaire

Je recommanderais d'utiliser CsQuery ( https://www.nuget.org/packages/CsQuery/1.3.4 ) et ensuite c'est aussi simple que

var doc = CQ.CreateFromUrl(@"http://www.karmaloop.com/Browse.htm");
var nodes = doc.Find("span.thumbnail-details-grey");
foreach(var node in nodes)
    Console.WriteLine(node.InnerText);


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