2017-05-07 6 views
0

Ich habe ein Problem mit XPath in C#
ich alle Elemente mit dieser Struktur finden wollen
I 10 Links haben, die alle von ihnen diese Struktur haben:
HTML XPath Suche nach Klassennamen

<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> 

Mit diesem Beispiel möchte ich beispielsweise "Google" und "www.google.com" und "Suche in der Welt" aufrufen.

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;} 

Aber ich bekomme Fehler NULL-Verweis

Antwort

2

Das Problem in der Abfrage ist, wo Sie die titles bekommen. Sie suchen nach div, dessen class Attribut PartialSearchResults-item enthält. Dies ist der Stammknoten Ihres Elements. Aber es gibt auch andere Knoten, die zu Ihrer Anfrage befriedigend sind, zum Beispiel das div mit der Klasse PartialSearchResults-item-title, das auch zu Ihrer Frage befriedigend ist. Dann, nach der Auswahl dieser 2 divs, die Sie durchlaufen und versuchen, summe Kindknoten zu bekommen, wird der Code für die erste Iteration gut funktionieren, weil Sie den rechten Knoten haben, aber in der zweiten Iteration haben Sie den Knoten mit der Klasse PartialSearchResults-item-title ein a, so dass Sie NullReferenceException in der zweiten Iteration erhalten, wenn Sie für die Beschreibung abfragen, da Sie

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

ich würde vorschlagen, bekommen Wert der InnerText Eigenschaft null Objekt versuchen nicht contains zu verwenden. In Ihrem Fall hat Ihren Stammknoten nur eine Klasse PartialSearchResults-item, so können Sie es wie folgt richtig

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

Ihre Lösung Abfrage ist, aber ich bin auch an derselben Stelle und in meinem Fall mit Klassennamen 'PartialSearchResults-Artikel stecken '(für zB.) Ich habe auch andere Klassen. also nicht in der Lage, das Ergebnis zu erhalten, indem man verwendet 'var titles = hd.DocumentNode.SelectNodes (" // div [@ class = 'PartialSearchResults-item'] ");' für die Verwendung dieser Syntax muss ich jeden Klassennamen angeben mit dem wird nicht behoben werden. – Divya