我正在使用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 Reference Exception”。那是为什么?
答案 0 :(得分:5)
我的猜测是<a>
个标签没有href
属性(即锚点而不是链接)。请尝试a.GetAttributeValue("href", "").Contains...
。
答案 1 :(得分:1)
您正在处理的各种对象有可能被评估为null,并且由于您没有进行空检查,因此有些可能会抛出 NullReferenceException 。可能的罪魁祸首:
如果您不确定要处理的对象,安全做法是使用空值守卫,除非您可以在封装类中保证相关对象不会为空。
正如吉米在他的回答中指出的那样,你正在处理的标记可能无法保证你拥有的元素或属性,除非你能保证,你需要做一些防御性编程。