Вопрос по XPath

ftbwork10

Client
Регистрация
29.05.2017
Сообщения
447
Благодарностей
700
Баллы
93
Пробую спарсить с помощью XPath выдачу рамблера.
Пример: http://nova.rambler.ru/search?query=новости омска 25 11 2017

Взял пример отсюда http://zennolab.com/discussion/threads/pomogite-s-parsingom-teksta.28069/#post-199924

Подставил свои значения в этот код, снипет выполняется успешно, но результат пустой. Почему так?
Прикладываю снипет

Код:
var html = project.Variables["HTML"].Value; // html страница
var doc = new HtmlDocument();
doc.LoadHtml(html); // создали объект HtmlDocument и загрузили в него html страницу
var nodes = doc.DocumentNode
    .SelectNodes(".//div[@class='b-serp-item']") // взяли нужные узлы
    .Select(n => n.FirstChild)
    .Where(n => n.FirstChild.GetAttributeValue("class", "") == "b-serp-item__header") // взяли без рекламы
    .ToList();
         
var list = new List<string>();
foreach (var node in nodes) // в цикле добавляем в список элемент состоящий из двух строчек
{
    var title = node.FirstChild.FirstChild.InnerText; // текст первой строчки
    var desc = node.SelectSingleNode(".//p[@class='b-serp-item__header']").InnerText; // текст второй строчки
   
    list.Add(desc + "\r\n" + title); // добавил в список "двойную строчку"
}
var res = string.Join("\r\n", list); // объединил двойный строчки
return res;
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
А вы хоть в браузере тестировали те XPath?
Вместо
Код:
.//p[@class='b-serp-item__header']
Надо было
Код:
.//h2[@class='b-serp-item__header']
И т.д.
Прикрепляю рабочую версию, но хз то ли я выдернул что вам надо. Смените тогда пути XPath на свои.
Вот шаблон:
http://orka13.ru/fls/Zenno/HtmlAgilityPack_Пример_Rambler.zip
Вот пост с мануалами:
http://zennolab.com/discussion/threads/ispolzovanie-xpath-na-chistom-html.40267/#post-299467
Вот код:
Код:
var html = project.Variables["HTML"].Value; // html страница
var doc = new HtmlDocument();
doc.LoadHtml(html); // создали объект HtmlDocument и загрузили в него html страницу
var nodes = doc.DocumentNode.SelectNodes("//div[@class='b-serp-item'][//h2[@class='b-serp-item__header']]"); // взяли нужные узлы сразу без рекламы (как писал @Moadip: "Для маньяков xpath")
project.SendInfoToLog("нашли столько узлов:" + nodes.Count.ToString(), true);   
var list = new List<string>();
foreach (var node in nodes) // в цикле добавляем в список элемент состоящий из двух строчек
{
    var title = node.SelectSingleNode(".//h2[@class='b-serp-item__header']").InnerText; // текст заголовка
    var desc = node.SelectSingleNode(".//p[@class='b-serp-item__snippet']").InnerText; // текст описания

    list.Add(desc + "\r\n" + title); // добавил в список "двойную строчку"

}
var res = string.Join("\r\n", list); // объединил двойный строчки
return res;
 
  • Спасибо
Реакции: ftbwork10

ftbwork10

Client
Регистрация
29.05.2017
Сообщения
447
Благодарностей
700
Баллы
93
Спасибо большое за подробный ответ! А как построить xpath, если нужная информация находится так?

<p>Информация</p>
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Вопрос поставлен некорректно, или просто в нем мало данных.
Вся суть xpath базируется на поиске элемента по его параметрах и положению относительно других элементов. Этот блок можно искать по содержимому тега <p>, но надо быть уверенным что найдется только 1 элемент, иначе надо добавлять больше условий поиска.
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)