-5

この場合、うまく機能せず、同じリンクをリストに追加し続けます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using HtmlAgilityPack;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml.Linq;
using System.Net;
using System.Web;


namespace GatherLinks
{
    public partial class Form1 : Form
    {
        int sites = 0;
        int y = 0;
        string url = @"http://www.google.co.il";
        string guys = "http://www.google.com";

        public Form1()
        {
            InitializeComponent();

            List<string> a = webCrawler(guys, 2);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private int factorial(int n)
        {
            if (n == 0) return 1;
            else y = n * factorial(n - 1);
            richTextBox1.Text = y.ToString();
            return y;


        }

        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;
                    mainLinks.Add(href);
                }
            }
            return mainLinks;

        }


        private List<string> webCrawler(string url, int levels)
        {

                HtmlAgilityPack.HtmlDocument doc;
                HtmlWeb hw = new HtmlWeb();
                List<string> webSites;// = new List<string>();
                List<string> csFiles = new List<string>();

                csFiles.Add("temp string to know that something is happening in level = " + levels.ToString());
                csFiles.Add("current site name in this level is : " + url);
                                try
                {
                    doc = hw.Load(url);
                    webSites = getLinks(doc);

                    if (levels == 0)
                    {
                        return csFiles;
                    }
                    else
                    {
                        int actual_sites = 0;
                        for (int i = 0; i < webSites.Count() && i < 20; i++)                         {
                            string t = webSites[i];
                                                        if ((t.StartsWith("http://") == true) || (t.StartsWith("https://") == true)) // replace this with future FilterJunkLinks function
                            {
                               // for (int e = 0; e < csFiles.Count; e++)
                               // {
                                    if (csFiles.Contains(t))
                                    {
                                    }
                                    else
                                    {
                                        actual_sites++;
                                        csFiles.AddRange(webCrawler(t, levels - 1));
                                        Texts(richTextBox1, "Level Number " + levels + " " + t + Environment.NewLine, Color.Red);
                                    }
                               // }
                            }
                        }
                        // report to a message box only at high levels..
                        //if (levels==1)
                        //MessageBox.Show(actual_sites.ToString());

                        return csFiles;
                    }



                }
                catch
                {
                    return csFiles;
                }

        }

そして Texts 関数:

public void Texts(RichTextBox box, string text, Color color)
        {
            box.SelectionStart = box.TextLength;
            box.SelectionLength = 0;

            box.SelectionColor = color;
            box.AppendText(text);
            box.SelectionColor = box.ForeColor;
        } 

webCrawler 関数で 2 つのことを行う必要があります。

  1. url 変数を解決できない場合は、try と catch で解決する必要があります。

  2. List csFiles に既に同じ項目が含まれている場合は、再度追加しないでください。たとえば、csFiles に既にhttp://www.google.comがある場合、 http://www.google.comを再度追加しないでください。最終的に csFiles リストにはhttp://www.google.comのみが含まれます。一度。

4

1 に答える 1

0

あなたのcontainsの使い方は間違っています。私があなたの問題を理解したら..私は勇敢で推測を危険にさらします..

for (int i = 0; i < webSites.Length && i < 20; i++)
{

   if ((t.StartsWith("http://") == true) || (t.StartsWith("https://") == true)) // replace this with future FilterJunkLinks function
   {
     if (csFiles.Contains(t))
     {
     //dosomething
     }
     else
     {
        actual_sites++;
        csFiles.AddRange(webCrawler(t, levels - 1));
        Texts(richTextBox1, "Level Number " + levels + " " + t + Environment.NewLine,  
        Color.Red);
     }
   }
}

}

更新: 再帰についてあまり理解していません。実際、私はそれを避けていますが、それはあなたの問題の別のものだと思います. コードを再帰的に呼び出すと、すべてのリンクを含む以前のリストを「忘れて」います。そのため、毎回新しい csFile を作成する代わりに、webcrawler でリストへの参照を渡すことをお勧めします。それが解決することを願っています。

意味:

private List<string> webCrawler(string url, int levels,List<string> csFiles)

于 2012-09-11T22:01:04.533 に答える