HTML XPath Recherche par nom de classe

asp.net c# html html-agility-pack xpath

Question

J'ai un problème avec xpath en c #
Je veux trouver tous les éléments avec cette structure
J'ai 10 liens qui ont tous cette structure:

<div class="PartialSearchResults-item" data-zen="true">
<div class="PartialSearchResults-item-title">
<a class="PartialSearchResults-item-title-link result-link"target="_blank" href='https://www.google.com/'> Google</a>
    </div>
<p class="PartialSearchResults-item-url">www.google.com</p>
<p class="PartialSearchResults-item-abstract">Search the world.</p>
   </div>

Par exemple, avec cet exemple, je souhaite utiliser "Google", "www.google.com" et "Rechercher dans le monde".

var titles = hd.DocumentNode.SelectNodes("//div[contains(@class, 'PartialSearchResults-item')]");
string link;
foreach (HtmlNode node in titles){
string description = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-abstract')]").InnerText;

link = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-url')]").InnerText;

 string title = node.SelectSingleNode(".//a[contains(@class,'PartialSearchResults-item-title-link result-link')]").InnerText;}

Mais je reçois une erreur null référence

Réponse acceptée

Le problème est dans la requête où vous obtenez les titles . Vous recherchez l'attribut class div qui contient PartialSearchResults-item , qui est le nœud racine de votre élément. Mais il existe également d'autres nœuds qui PartialSearchResults-item-title votre requête, par exemple div avec la classe PartialSearchResults-item-title également votre requête. Ensuite , après avoir sélectionné ce 2 divs vous itérer sur eux et essayer d'obtenir les nœuds enfants somme, pour la première itération votre code fonctionne très bien, parce que vous avez nœud droit, mais dans la deuxième itération vous avez le nœud avec classe PartialSearchResults-item-title qui n'a qu'un seul a , vous obtiendrez donc NullReferenceException à la deuxième itération lorsque vous interrogez la description, car vous essayez d'obtenir la valeur de la propriété InnerText de null objet null

string description = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-abstract')]").InnerText;

Je suggère de ne pas utiliser contains . Dans votre cas, votre nœud racine n'a qu'une seule classe PartialSearchResults-item , vous pouvez donc l'interroger comme ceci.

var titles = hd.DocumentNode.SelectNodes("//div[@class='PartialSearchResults-item']");


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow