Ich schreibe einen Webskraper, der spezifische URLs erfasst und sie zu einer Liste hinzufügt.
using HtmlAgilityPack;
List<string> mylist = new List<string>();
var firstUrl = "http://example.com";
HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load(firstUrl);
HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//div[contains(@class,'Name')]/a");
foreach (HtmlNode htmlNode in (IEnumerable<HtmlNode>)nodes)
{
if (!mylist.Contains(htmlNode.InnerText))
{
mylist.Add(htmlNode.InnerText);
}
}
Was ich an diesem Punkt tun möchte, ist, durch 'meine Liste' zu gehen und genau dasselbe zu tun und grundsätzlich für immer fortzufahren. Der Code sollte neu geparste URLs aufnehmen und sie zur Liste hinzufügen. Was wäre der einfachste Weg, dies zu tun?
Ich habe versucht, eine for-Schleife direkt nach der oben genannten zu erstellen. Aber es scheint nicht die Liste zu aktualisieren. Es wird immer nur für immer dieselben Elemente in der Liste durchlaufen (da ich immer kleiner sein werde als meine Liste.Zahl)
for (int i = 0; i < mylist.Count; i++)
{
//the items in mylist are added to the url
var urls = "http://example.com" + mylist[i];
HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load(urls);
HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//div[contains(@class,'Name')]/a");
foreach (HtmlNode htmlNode in (IEnumerable<HtmlNode>)nodes)
{
if (!mylist.Contains(htmlNode.InnerText))
{
mylist.Add(htmlNode.InnerText);
}
}
}
Vielen Dank!
Queue
passend für Ihre Anforderung.
Queue<string> mylist = new Queue<string>();
Erster Pass :
using HtmlAgilityPack;
Queue<string> mylist = new Queue<string>();
var firstUrl = "http://example.com";
HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load(firstUrl);
HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//div[contains(@class,'Name')]/a");
foreach (HtmlNode htmlNode in (IEnumerable<HtmlNode>)nodes)
{
if (!mylist.Contains(htmlNode.InnerText))
{
mylist.Enqueue(htmlNode.InnerText);
}
}
Jetzt der zweite Durchgang
while (mylist.Count > 0)
{
var url = mylist..Dequeue();
//the items in mylist are added to the url
var urls = "http://example.com" + url;
HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load(urls);
HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//div[contains(@class,'Name')]/a");
foreach (HtmlNode htmlNode in (IEnumerable<HtmlNode>)nodes)
{
if (!mylist.Contains(htmlNode.InnerText))
{
mylist.Enqueue(htmlNode.InnerText);
}
}
}
Go NuGet "System.Interactive" und dann folgendes tun:
var found = new HashSet<string>();
var urls =
EnumerableEx
.Expand(
new[] { "http://example.com" },
url =>
{
var web = new HtmlWeb();
var document = web.Load(url);
var nodes = document.DocumentNode.SelectNodes("//div[contains(@class,'Name')]/a");
return
nodes
.Cast<HtmlNode>()
.Select(x => x.InnerText)
.Where(x => !found.Contains(x))
.Do(x => found.Add(x))
.Select(x => "http://example.com" + x);
});