HTML XPath 按 class 名称搜索

HTML XPath Searching by class name

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

例如,对于这个示例,我想得到 "Google" 和 "www.google.com" 以及 "Search the world."

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

但是我得到错误的空引用

问题出在您获取 titles 的查询中。您正在查找 div,其中 class 属性包含 PartialSearchResults-item,这是您项目的根节点。但是还有其他节点可以满足您的查询,例如 div 和 class PartialSearchResults-item-title 也可以满足您的查询。然后在选择这 2 divs 之后,您将迭代它们并尝试获取总和子节点,对于第一次迭代,您的代码将正常工作,因为您有正确的节点,但在第二次迭代中,您的节点具有class PartialSearchResults-item-title 只有一个 a,因此当您查询描述时,您将在第二次迭代中得到 NullReferenceException,因为您正在尝试获取InnerText 属性 共 null 个对象

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

我建议不要使用 contains。在你的情况下你的根节点只有一个 class PartialSearchResults-item,所以你可以这样查询它

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