2017-05-07 90 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