HTML XPath 按类名搜索
Posted
技术标签:
【中文标题】HTML XPath 按类名搜索【英文标题】:HTML XPath Searching by class name 【发布时间】:2017-10-05 15:51:35 【问题描述】:我在 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”和“搜索世界”。
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】:问题在于您获得titles
的查询。您正在寻找 class
属性包含 PartialSearchResults-item
的 div,这是您项目的根节点。但也有其他节点可以满足您的查询,例如具有 PartialSearchResults-item-title
类的 div 也可以满足您的查询。然后在选择这 2 个 div 之后,您将对其进行迭代并尝试获取子节点的总和,对于第一次迭代,您的代码将正常工作,因为您有正确的节点,但在第二次迭代中,您有一个类为 PartialSearchResults-item-title
的节点只有一个a
,因此当您查询描述时,您将在第二次迭代中获得NullReferenceException
,因为您正在尝试获取null
对象的InnerText
属性的值
string description = node.SelectSingleNode(".//*[contains(@class,'PartialSearchResults-item-abstract')]").InnerText;
我建议不要使用contains
。在您的情况下,您的根节点只有一个类PartialSearchResults-item
,因此您可以像这样查询它
var titles = hd.DocumentNode.SelectNodes("//div[@class='PartialSearchResults-item']");
【讨论】:
您的解决方案是正确的,但我也被困在同一点上,在我的情况下,类名PartialSearchResults-item
(例如)我也有其他类。所以无法通过使用var titles = hd.DocumentNode.SelectNodes("//div[@class='PartialSearchResults-item']");
来获得结果,因为使用这种语法我需要给每个类名以及不会被修复的类名。以上是关于HTML XPath 按类名搜索的主要内容,如果未能解决你的问题,请参考以下文章