0

我正在使用 HTML 敏捷包来抓取网站。我正在查看所有包含某些文本的“a”元素的 div 标签。这是示例代码:

 var showLocations = (from div in document.DocumentNode.Descendants("div")
                                 from a in div.DescendantNodes().Where(x => x.Name == "a")
                                 where a.Attributes["href"].Value.Contains("show_locs=Y")
                                 select a).SingleOrDefault();

但是,如果找不到元素,它不会返回 null,而是会引发“Null 引用异常”。这是为什么?

4

2 回答 2

5

我的猜测是有些<a>标签没有href属性(即锚点而不是链接)。试试吧a.GetAttributeValue("href", "").Contains...

于 2012-06-22T20:34:24.347 回答
1

您正在处理的各种对象都有可能评估为 null,并且由于您没有进行 null 检查,因此有些对象可能会抛出NullReferenceException。可能的罪魁祸首:

  1. 文档.文档节点
  2. a.属性[“href”]
  3. a.Attributes["href"].Value

如果您不确定要处理的对象,安全的做法是使用 null 保护,除非您可以在封装类中保证相关对象不会为 null。

正如 Jimmy 在他的回答中指出的那样,您正在处理的标记可能无法保证具有您所追求的元素或属性,除非您可以保证,否则您需要进行一些防御性编程。

于 2012-06-22T20:36:11.940 回答