У меня проблема с xpath в c #
Я хочу найти все элементы с этой структурой
У меня есть 10 ссылок, каждая из которых имеет такую структуру:
<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>
например, с этим образцом я хочу получить «Google» и «www.google.com» и «Поиск в мире».
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;}
Но я получаю ошибку null reference
Проблема заключается в запросе, в котором вы получаете titles
. Вы ищете DIV , который ый class
атрибут содержит PartialSearchResults-item
, который является корневым узлом вашего элемента. Но есть и другие узлы, которые удовлетворяют вашему запросу, например div с классом PartialSearchResults-item-title
также удовлетворяющим вашему запросу. Затем, выбирая эти 2 divs, вы повторяете их и пытаетесь получить суточные дочерние узлы, для первой итерации ваш код будет работать нормально, потому что у вас есть правильный узел, но на второй итерации у вас есть узел с классом PartialSearchResults-item-title
которой только один a
, так что вы получите NullReferenceException
во второй итерации , когда вы запрашиваете для описания, потому что вы пытаетесь получить значение InnerText
свойства null
объекта
string description = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-abstract')]").InnerText;
Я бы предложил не использовать contains
. В вашем случае ваш корневой узел имеет только один класс PartialSearchResults-item
, поэтому вы можете запросить его так:
var titles = hd.DocumentNode.SelectNodes("//div[@class='PartialSearchResults-item']");