2017-05-07 1 views
0

J'ai un problème avec XPath dans C#
Je veux trouver tous les éléments de cette structure
J'ai 10 liens qui tous ont cette structure:
HTML XPath Recherche par nom de classe

<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 veux obtenir "Google" et "www.google.com" et "Rechercher 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 j'obtiens l'erreur référence null

Répondre

2

Le problème est dans la requête où vous obtenez le titles. Vous recherchez div qui est class attribut contient PartialSearchResults-item, qui est le nœud racine de votre article. Mais il y a aussi d'autres noeuds qui satisfont votre requête, par exemple le div avec la classe PartialSearchResults-item-title aussi satisfaisant à votre requête. Ensuite, après avoir sélectionné cette 2 divs vous itérez sur eux et en essayant d'obtenir des nœuds sum enfants, pour la première itération votre code fonctionnera bien, parce que vous avez un nœud droit, mais dans la deuxième itération vous avez le nœud avec la classe PartialSearchResults-item-title un a, vous obtiendrez NullReferenceException dans la deuxième itération lorsque vous interrogez pour la description, parce que vous essayez d'obtenir la valeur de la propriété InnerText de null objet

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, donc vous pouvez interroger comme ça

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

Votre solution est correcte, mais je suis aussi coincé au même point et dans mon cas, avec le nom de la classe 'PartialSearchResults-article '(par exemple.) J'ai d'autres classes aussi. donc pas en mesure d'obtenir le résultat en utilisant 'var titles = hd.DocumentNode.SelectNodes (" // div [@ class = 'PartialSearchResults-item'] ");' pour utiliser cette syntaxe j'ai besoin de donner chaque nom de classe alongwith qui ne sera pas fixé. – Divya