【发布时间】:2021-03-18 15:26:11
【问题描述】:
我正在抓取一个网页,直到现在我正在使用 try/catch 捕获一个 ArgumentNullException。但是,我想将逻辑更改为使用if。我的尝试在下面。
if (document.DocumentNode.SelectNodes("//td")
.Where(x => x.Attributes["title"].Value.Contains("Log.html")).Any() is true) {
HtmlNode[] nodes = document.DocumentNode.SelectNodes("//td")
.Where(x => x.Attributes["title"].Value.Contains("Log.html")).ToArray();
if (nodes.Length > 1) {
nodes = nodes.Where((source, index) => index != 1).ToArray();
}
[..........]
} else {
LogException("Item is null", taskId, buildId);
}
但是就行了:
if (document.DocumentNode.SelectNodes("//td") .Where(x => x.Attributes["title"].Value.Contains("Log.html")).Any() 为真)
我仍然收到ArgumentNullException。我应该怎么写呢?
【问题讨论】:
-
首先你不应该抓住
ArgumentNullException。相反,您应该首先避免它。除此之外,异常究竟发生在哪里?这里哪个变量为空? -
您可以使用when in a catch 语句仅在条件为真时捕获异常。目前还不清楚你想要什么。您发布的内容不应引发此类异常除非
Value为空。is true没有意义,因为Any总是返回一个布尔值。 实际异常是什么?如果Value为空,捕获异常将无济于事 -
您可以使用
.SelectNodes.Any(x=>...)来缩短表达式,但更好的选择是使用适当的 XPath 表达式://td[contains(@title,'Log.html')]。 -
抓取网页时,有时
Log.html会丢失,因此Value为空并抛出此异常。我之前可以使用try/catch绕过它,但我认为这不是一个好习惯,至少在这种情况下是这样。因此,我一直在尝试使用if,但我不知道怎么做。 -
谢谢@PanagiotisKanavos,我会试试的。
标签: c# web-scraping html-agility-pack