0

我有 2 个列表:

public List<string> my_link = new List<string>();
public List<string> english_word = new List<string>();

我正在从页面中抓取一些链接并将它们保存到“my_link”中;为此,我正在使用以下代码:

HtmlWeb web = new HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = web.Load("http://search.freefind.com/find.html?id=59478474&pid=r&ics=1&query=" + x);
HtmlNodeCollection nodes=doc.DocumentNode.SelectNodes("//font[@class='search-results']//a");

try
{
    foreach (HtmlNode n in nodes)
    {
        link = n.InnerHtml;
        link = link.Trim();
        my_link.Add(link);
    }
}
catch (NullReferenceException )
{
    MessageBox.Show("NO link found ");            
}
       

然后我正在抓取我抓取的链接上的一些内容,并将每个链接的内容存储在一个english_word.Add(q);它可以从除最后一个链接之外的所有链接中抓取内容。我的代码就是这样

foreach (string ss in my_link)
{
    HtmlWeb web2 = new HtmlWeb();
    HtmlAgilityPack.HtmlDocument doc2 = web2.Load(ss);
    HtmlNodeCollection nodes2 = doc2.DocumentNode.SelectNodes("//table[@id='table1']//tr[position()>1]//td[position()=2]");
    try
    {
        foreach (HtmlNode nn in nodes2)
        {
            q = nn.InnerText;
            q = System.Net.WebUtility.HtmlDecode(q);
            q = q.Trim();
            english_word.Add(q);
        }
    }
    catch (NullReferenceException ex)
    {
        MessageBox.Show("No english word is found ");
    }
}

仅对于最后一个链接,它显示“未找到英文单词”

我究竟做错了什么?

4

2 回答 2

0
  1. 更改您的 catch 语句以捕获所有异常,而不仅仅是 NullReferenceException。
  2. 调试器是你的朋友,使用它。我猜你在向列表中添加新单词之前会在某个地方遇到异常。在 foreach 循环中设置断点。
于 2013-02-04T17:09:10.437 回答
0

首先,在这里捕捉NullReferenceException不是一个好主意。最好检查null您期望空值的位置。

其次,如果没有找到节点,您很可能会因为HtmlNode.SelectNodes方法返回null(不是一个空的节点集合,正如您所期望的那样)而得到此异常。请参阅 HTML Agility Pack Null 参考C#/ Html Agility Pack 错误“值不能为空。参数名称:Source。”</a>,以及CodePlex上的讨论

try .. catch因此,您可以使用以下内容而不是块:

if (nodes2 != null)
{
    foreach (HtmlNode nn in nodes2)
    {
        q = nn.InnerText;
        q = System.Net.WebUtility.HtmlDecode(q);
        q = q.Trim();
        english_word.Add(q);
    }
}
else
{
    MessageBox.Show("No english word is found ");
}
于 2013-02-07T07:37:25.413 回答