これは機能です:
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がnullであるため、ここのテスト関数またはgetLinks関数でこのケースを処理する必要があります. 私がやりたいことは、タイムアウトがあったことをユーザーに伝えるだけでなく、次のURLへのプロセスを続行することです。テスト関数では、クロールのようにテスト関数を何度も呼び出し、そのたびに変数 url に異なる URL が含まれています。
これは、クロールを行っている行です。
csFiles.AddRange(test(t, levels - 1, eve));
csFiles はローカル リストです
したがって、URL に別のリンクが含まれるたびに、この Web サイトのリンクを取得しようとします。しかし、doc は null であり、関数 getLinks に移動するため、次の行の getLinks で:
var linkNodes = document.DocumentNode.SelectNodes("//a[@href]");
null例外が発生し、プログラムが停止します。null はドキュメントが null であるためです。
では、どうすればこのケースを処理し、プログラムが次のリンクに進むようにできますか? そして、その null と例外があるので停止しないでください。
その場合、質問を更新し、完全なテスト機能を追加します。