【问题标题】:HTML XPath Searching by class nameHTML XPath 按类名搜索
【发布时间】: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;}

但我得到错误空引用

【问题讨论】:

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


    【解决方案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']"); 来获得结果,因为使用这种语法我需要给每个类名以及不会被修复的类名。
    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 2018-12-07
    • 2015-10-17
    • 2021-12-31
    • 2020-08-10
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多