2017-01-03 4 views
0

Ich kann das einfach nicht verstehen.XPath, mehrere Elemente aus mehreren Knoten in HTML auswählen

Ich muss durch alle Knoten mit Klassen mit "item extend featured" Werten suchen (Code unten). In diesen Klassen muss ich jeden InnerText von <h2 class="itemtitle"> und href Wert darin 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 wie folgt sein:

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


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

Also, die Frage ist, wie durch alle "item extend featured" Knoten in html zu durchqueren, und wählen Sie Elemente, die ich von jedem Knoten oben benötigen?

Wie ich verstehe, so etwas wie das funktionieren sollte, aber es bricht auf halber Strecke

EDIT: Ich habe bemerkt, gibt es 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); 
} 
+0

Frage hinzugefügt. – CsharpNoob

+0

können Sie den Code teilen, den Sie bisher ausprobiert haben? – eLRuLL

+0

aktualisieren Sie die Antwort, das ist nicht lesbar. – eLRuLL

Antwort

1
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); 
} 
+0

Dies ist im Grunde es, danke ein TON. – CsharpNoob

1

Was Sie versuchen, erfordert Ausdrücke mehrere XPath zu erreichen, da Sie nicht mehrere Ergebnisse auf verschiedenen Ebenen mit einer Abfrage (es sei denn, Sie Union vielleicht verwenden) zurückkehren kann.

Was Sie vielleicht suchen werden ist etwas ähnlich wie diese:

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

Verwandte Themen