Ich habe ein Problem mit Xpath in c #
Ich möchte alle Elemente mit dieser Struktur finden
Ich habe 10 Links, die alle diese Struktur haben:
<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 Referenz
Das Problem ist in der Abfrage, wo Sie die titles
. Sie suchen nach dem class
div, das PartialSearchResults-item
enthält. PartialSearchResults-item
ist der PartialSearchResults-item
Ihres Elements. Aber es gibt auch andere Knoten, die Ihrer Abfrage PartialSearchResults-item-title
, zum Beispiel das div mit der Klasse PartialSearchResults-item-title
auch für Ihre Abfrage PartialSearchResults-item-title
. Nachdem Sie diese 2 Divs ausgewählt haben, durchlaufen Sie diese und versuchen, die Summe der Child Nodes zu erhalten. Für die erste Iteration wird Ihr Code gut funktionieren, da Sie den rechten Knoten haben. In der zweiten Iteration haben Sie den Knoten mit der Klasse PartialSearchResults-item-title
die nur eine a
, so erhalten Sie NullReferenceException
in der zweiten Iteration, wenn Sie nach der Beschreibung InnerText
, weil Sie versuchen, den Wert der InnerText
Eigenschaft von null
Objekt zu erhalten
string description = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-abstract')]").InnerText;
Ich würde vorschlagen , nicht verwenden contains
. In Ihrem Fall hat Ihr Wurzelknoten nur eine Klasse PartialSearchResults-item
, so dass Sie ihn so abfragen können
var titles = hd.DocumentNode.SelectNodes("//div[@class='PartialSearchResults-item']");