2017-01-03 178 views
0

我只是無法確定這一個。XPath,從HTML中的多個節點中選擇多個元素

我必須搜索所有具有"item extend featured"值的類的節點(代碼如下)。在這些類中,我需要選擇<h2 class="itemtitle">href中的每個InnerText值,以及來自<div class="title-additional">的所有InnerText。

<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和選擇上面我需要從每個節點的項目?

據我所知,這樣的事情應該工作,但它打破了一半

編輯:我剛剛注意到,還有在網站上共享完全相同的類的廣告,他們顯然不具備我所需要的元素。更多的問題需要考慮。

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

問題補充。 – CsharpNoob

+0

你能分享一下你到目前爲止嘗試過的代碼嗎? – eLRuLL

+0

更新答案,這是不可讀的。 – eLRuLL

回答

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

這基本上就是這樣,謝謝TON。 – CsharpNoob

1

什麼你正在努力實現需要多個XPath表達式,你不能用一個查詢(除非您使用聯盟也許)返回在不同層面多個結果。

你可能會尋找什麼是類似於此:

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 
} 

注:代碼沒有測試