2017-05-07 47 views
0

我在C#使用XPath問題
我想找到這種結構
我有10個環節的所有元素,所有這些都有這樣的結構:
HTML的XPath搜索類名

<div class="PartialSearchResults-item" data-zen="true"> 
<div class="PartialSearchResults-item-title"> 
<a class="PartialSearchResults-item-title-link result-link"target="_blank" href='https://www.google.com/'> Google</a> 
    </div> 
<p class="PartialSearchResults-item-url">www.google.com</p> 
<p class="PartialSearchResults-item-abstract">Search the world.</p> 
    </div> 

例如,我想通過這個示例獲得「Google」和「www.google.com」和「搜索世界」。

var titles = hd.DocumentNode.SelectNodes("//div[contains(@class, 'PartialSearchResults-item')]"); 
string link; 
foreach (HtmlNode node in titles){ 
string description = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-abstract')]").InnerText; 

link = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-url')]").InnerText; 

string title = node.SelectSingleNode(".//a[contains(@class,'PartialSearchResults-item-title-link result-link')]").InnerText;} 

,但我得到的錯誤空引用

回答

2

的問題是在您得到titles查詢。您正在尋找div的class屬性包含PartialSearchResults-item,這是您的項目的根節點。但也有其他節點滿足您的查詢,例如類PartialSearchResults-item-title的div也滿足您的查詢。然後選擇這2個div後,您正在對它們進行迭代並嘗試獲取子節點的總和,對於第一次迭代,您的代碼將正常工作,因爲您有正確的節點,但是在第二次迭代中,您有隻有PartialSearchResults-item-title級別的節點一個a,所以你會在第二次迭代得到NullReferenceException當你要查詢的描述,因爲你試圖讓null對象

string description = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-abstract')]").InnerText; 

我建議不使用containsInnerText屬性的值。在你的情況你的根節點只有一個PartialSearchResults-item類,這樣你就可以查詢它像這樣

var titles = hd.DocumentNode.SelectNodes("//div[@class='PartialSearchResults-item']"); 
+0

您的解決方案是正確的,但我也停留在同一點,在我的情況下,類名'PartialSearchResults項目(例如)我也有其他課程。所以不能通過使用 'var titles = hd.DocumentNode.SelectNodes(「// div [@ class ='PartialSearchResults-item']」);' '使用這個語法來得到每個類名與此同時不會被修復。 – Divya