【问题标题】:C# HTML Agility Pack Single Select Node returning nullC# HTML 敏捷包单选节点返回 null
【发布时间】:2013-06-08 17:09:54
【问题描述】:

我有一个使用 C#、windows 窗体和 HTML Agility Pack 开发的网络爬虫。

当网站更改它的代码并破坏它时,我的一切都很好。我知道网络爬虫经常会发生这种情况,但现在我无法弄清楚如何纠正这个问题。

此时,我的抓取工具循环遍历多个 URL,并从每个页面抓取数据。

我遇到的问题是,它循环通过的站点模板将随机显示较新的模板,该模板没有我在程序中定义的相同 HTML 类和 ID。我想要做的是运行一个简单的 if 来检查单个节点是否为空,以及它是否为新模板运行一组单独的代码。

我遇到的问题是我的程序在 if 语句上抛出 NullReferenceException。

这是我用来检查它是否为空的语句:

var varitem = doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']").InnerText;

 if (varitem == null) MessageBox.Show("no titles");

它在定义变量的第一行抛出异常,甚至没有进入 if 语句。

任何建议表示赞赏!

【问题讨论】:

  • 检查doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']") 是否为空。当它为空时,你会得到 NullReferenceException (null.InnerText)
  • 好吧,我觉得自己像个白痴!谢谢你的帮助。如果你提交你的答案,我会接受它..

标签: c# winforms web-scraping html-agility-pack


【解决方案1】:

首先你应该检查是否

 doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']")

返回空值。

如果它为空,您将从null.InnerText 获得NullReferenceException

【讨论】:

    【解决方案2】:

    下面试试

    var varitem = doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']");
    

    SelectSingleNode 可以返回 null 并且您最好检查 InnerText 是否也不是 null 或为空

    if (varitem == null || string.IsNullOrEmpty(varitem.InnerText))
                  MessageBox.Show("no titles");
    

    【讨论】:

      猜你喜欢
      • 2014-03-26
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 2012-07-18
      • 2013-03-04
      • 1970-01-01
      相关资源
      最近更新 更多