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. NullReferenceExceptionだけでなく、すべての例外をキャッチするようにcatchステートメントを変更します。
  2. デバッガーはあなたの友達です、それを使ってください。リストに新しい単語を追加する前に、どこかで例外が発生すると思います。foreachループにブレークポイントを設定します。
于 2013-02-04T17:09:10.437 に答える
0

まず、ここで捕まえるのNullReferenceExceptionはあまり良い考えではありません。nullnullが予想される場所を確認することをお勧めします。

次に、ノードが見つからない場合、HtmlNode.SelectNodesメソッドが(予想どおり空のノードのコレクションではなく)返されるため、この例外が発生する可能性があります。nullHTML Agility Pack Null ReferenceC#/ HtmlAgilitypackエラー「値をnullにすることはできません。パラメータ名: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 に答える