这是功能:
private List<string> getLinks(HtmlAgilityPack.HtmlDocument document)
{
List<string> mainLinks = new List<string>();
var linkNodes = document.DocumentNode.SelectNodes("//a[@href]");
if (linkNodes != null)
{
foreach (HtmlNode link in linkNodes)
{
var href = link.Attributes["href"].Value;
if (href.StartsWith("http://") == true || href.StartsWith("https://") == true || href.StartsWith("www") == true) // filter for http
{
mainLinks.Add(href);
}
}
}
return mainLinks;
}
有时,如果站点超时未响应或链接格式不正确,则可变文档为 nuul,例如,链接为:wdfsfdgfsdg
所以在我做的功能测试中:
private List<string> test(string url, int levels,DoWorkEventArgs eve)
{
levels = levelsTo;
HtmlWeb hw = new HtmlWeb();
List<string> webSites;
try
{
this.Invoke(new MethodInvoker(delegate { Texts(richTextBox1, "Loading The Url: " + url + "..." , Color.Red); }));
HtmlAgilityPack.HtmlDocument doc = to.GetHtmlDoc(url, reqOptions, null);
if (timeOut == true)
{
this.Invoke(new MethodInvoker(delegate { Texts(richTextBox1, " There Was A TimeOut" + Environment.NewLine , Color.Red); }));
timeOut = false;
}
else
{
this.Invoke(new MethodInvoker(delegate { Texts(richTextBox1, " Done " + Environment.NewLine, Color.Red); }));
}
webSites = getLinks(doc);
因此,假设 url 是 wdfsfdgfsdg 然后 webSites 正在调用/使用 getLinks 但由于 url 错误,变量 doc 为空,所以在测试函数或 getLinks 函数中我需要处理这种情况。我想要做的是它会告诉用户有一个超时,但也会继续处理到下一个 url。在测试函数中,我一次又一次地调用测试函数,就像爬行一样,每次变量 url 都包含不同的 url。
这是我做爬行的那一行:
csFiles.AddRange(test(t, levels - 1, eve));
csFiles 是一个本地列表
所以每次 url 都包含另一个链接,然后尝试获取该网站的链接。但是由于 doc 是 null 并且它转到函数 getLinks 所以在 getLinks 上就行了:
var linkNodes = document.DocumentNode.SelectNodes("//a[@href]");
我得到空异常并且程序停止。null 是因为文档为空。
那么我该如何处理这种情况并使程序继续到下一个链接?并且不要停止,因为它的 null 并且有一个例外。
如果是,我将更新问题并添加完整的测试功能。