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']");
我在 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']");