XPath, выберите несколько элементов из нескольких узлов в HTML

c# html html-agility-pack xpath

Вопрос

Я просто не могу понять этого.

Мне нужно выполнить поиск по всем узлам, в которых есть классы с значениями "item extend featured" (код ниже). В этих классах мне нужно выбрать каждый InnerText из <h2 class="itemtitle"> и значение href в нем, плюс все InnerTexts из <div class="title-additional"> extra <div class="title-additional"> .

<li class="item extend featured">
    <div class="title-box">
        <h2 class="itemtitle">
            <a target="_top" href="www.example.com/example1/example2/exammple4/example4" title="PC Number 1">PC Number 1</a>
        </h2>
        <div class="title-additional">
            <div class="title-km">150 km</div>
            <div class="title-year">2009</div>
            <div class="title-price">250 €</div>
        </div>

Результат должен быть примерно таким:

Title:
href:
Title-km:
Title-year:
Title-Price:
--------------


Title:
href:
Title-km:
Title-year:
Title-Price:
--------------

Итак, вопрос в том, как пройти через все узлы "item extend featured" в html и выбрать элементы, которые мне нужны выше от каждого узла?

Как я понимаю, что-то вроде этого должно работать, но оно ломается наполовину

EDIT: Я только заметил, на сайте есть объявления, которые разделяют один и тот же класс, и у них явно нет необходимых элементов. Больше проблем думать.

var items1 = htmlDoc.DocumentNode.SelectNodes("//*[@class='item extend featured']");

foreach (var e in items1)
{
   var test = e.SelectSingleNode(".//a[@target='_top']").InnerText;
   Console.WriteLine(test);
}

Принятый ответ

var page = new HtmlDocument();
page.Load(path);
var lists = page.DocumentNode.SelectNodes("//li[@class='item extend featured']");
foreach(var list in lists)
{
    var link = list.SelectSingleNode(".//*[@class='itemtitle']/a");
    string title = link.GetAttributeValue("title", string.Empty);
    string href = link.GetAttributeValue("href", string.Empty);
    string km = list.SelectSingleNode(".//*[@class='title-km']").InnerText;
    string year = list.SelectSingleNode(".//*[@class='title-year']").InnerText;
    string price = list.SelectSingleNode(".//*[@class='title-price']").InnerText;
    Console.WriteLine("Title: %s\r\n href: %s\r\n Title-km: %s\r\n Title-year: %s\r\n Title-Price: %s\r\n\r\n", title, href, km, year, price);
}

Популярные ответы

То, что вы пытаетесь достичь, требует нескольких выражений XPath, поскольку вы не можете возвращать несколько результатов на разных уровнях с помощью одного запроса (если вы не используете Union, возможно).

То, что вы можете искать, похоже на это:

var listItems = htmlDoc.DocumentNode.SelectNodes("//li[@class='item extend featured']");

foreach(var li in listItems) {
    var title = li.SelectNodes("//h2/a/text()");
    var href = li.SelectNodes("//h2/a/@href");
    var title_km = li.SelectNodes("//div[@class='title-additional']/div[@class='title-km']/text()");
    var title_... // other divs
}

Примечание: код не проверен



Related

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