HTML XPath Поиск по названию класса

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

Вопрос

У меня проблема с 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']");


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow