Wählen Sie in XPath mehrere Elemente aus mehreren Knoten in HTML aus

c# html html-agility-pack xpath

Frage

Ich kann das einfach nicht verstehen.

Ich muss alle Knoten durchsuchen, die Klassen mit "item extend featured" Werten enthalten (Code unten). In diesen Klassen muss ich jeden InnerText von <h2 class="itemtitle"> und href Wert auswählen, plus alle InnerTexts von <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>

Die Ausgabe sollte etwa so aussehen:

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


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

Also, die Frage ist, wie man durch alle "item extend featured" Knoten in html und wählen Sie die Elemente, die ich brauche oben von jedem Knoten?

Soweit ich weiß, sollte so etwas funktionieren, aber es bricht auf halbem Wege

EDIT: Ich habe gerade bemerkt, es gibt Anzeigen auf der Website, die genau die gleiche Klasse teilen und sie haben offensichtlich nicht die Elemente, die ich brauche. Mehr Probleme zum Nachdenken.

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);
}

Akzeptierte Antwort

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);
}

Beliebte Antwort

Was Sie erreichen möchten, erfordert mehrere XPath-Ausdrücke, da Sie mit einer Abfrage nicht mehrere Ergebnisse auf verschiedenen Ebenen zurückgeben können (es sei denn, Sie verwenden Union möglicherweise).

Was Sie vielleicht suchen, ist etwas Ähnliches:

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
}

Hinweis: Code nicht getestet




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum