如果HtmlAgilityPack.HtmlDocument文档为空,我该怎么办?

时间:2012-09-19 21:30:05

标签: c#

这是功能:

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。

这是我正在进行抓取的行:

csFiles.AddRange(test(t, levels - 1, eve));

csFiles是本地列表

因此,每次url包含另一个链接,然后尝试获取此网站的链接。 但是因为doc是null并且它在getLinks中使用getLinks函数所以:

var linkNodes = document.DocumentNode.SelectNodes("//a[@href]");

我得到null异常并且程序停止。 null是因为document是null。

那么如何处理这种情况并使程序继续下一个链接?并且不要因为它的null而停止并且有例外。

如果我将更新问题并添加完整的测试功能。

1 个答案:

答案 0 :(得分:1)

嗯,它应该像检查null一样简单。

var linkNodes;

if(document != null)
{
    linkNodes= document.DocumentNode.SelectNodes("//a[@href]");
    // other things if document is not null
}
else
{
    // handle null case
}

如果您依赖于文档中的信息,那么您可以尝试从其他地方获取信息,或者中止操作。你可以做的更多

您还可以使用try / catch

try
{
    //some code here
}
catch(Exception ex)
{
    //log exception, display error to user, or handle exception some way
}
finally
{
    optional block.  clean up resources
}

如果您可以通过简单地检查null来完全避免异常,我会依赖于try / catch。

try / catch更适合您必须处理的意外异常,或者您无法控制的异常。