HTML XPath按类名搜索

时间:2017-05-07 16:55:43

标签: c# html asp.net xpath html-agility-pack

我在c#中遇到xpath问题 我想找到具有这种结构的所有元素
我有10个链接,所有这些链接都有这种结构:

<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>

例如,我希望得到这个样本&#34; Google&#34;和#34; www.google.com&#34;和#34;搜索世界。&#34;

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

但我得到错误空引用

1 个答案:

答案 0 :(得分:4)

问题在于您获得titles的查询。您正在查找哪个class属性包含PartialSearchResults-item的div,这是您项目的根节点。但是还有其他节点满足您的查询,例如,类PartialSearchResults-item-title的div也满足您的查询。然后在选择这两个div之后,你迭代它们并尝试获得sum子节点,对于第一次迭代,你的代码将正常工作,因为你有正确的节点,但在第二次迭代中你有节点{{1}只有一个PartialSearchResults-item-title,所以当你查询描述时,你将在第二次迭代中得到a,因为你试图获得NullReferenceException InnerText属性的值。 1}}对象

null

我建议不要使用string description = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-abstract')]").InnerText; 。在您的情况下,您的根节点只有一个类contains,因此您可以像这样查询它

PartialSearchResults-item