【发布时间】:2018-06-22 03:28:50
【问题描述】:
我正在编写一个抓取特定网址并将它们添加到列表中的网络爬虫。
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);
}
}
此时我想做的是遍历“mylist”并做完全相同的事情,基本上永远继续下去。代码应该采用新解析的 URL 并将它们添加到列表中。最简单的方法是什么?
我尝试在上述循环之后创建一个 for 循环。但它似乎没有更新列表。它只会永远循环遍历列表中已经存在的相同项目(因为 i 总是小于 mylist.Count)
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);
}
}
}
谢谢!
【问题讨论】:
-
这听起来像是实现递归的一个很好的用例,我将从阅读它开始。
-
递归很快就会stackoverflow,所以听起来绝对不像递归的情况;)
-
他想要一个队列
-
或使用
TPDataflow构建此权利,并使用CancelationToken提供自身的转换块,这比使用async和await的htmlweb 更好你的资源,还有一本讨厌的大字典,所以你不会在圈子里刮!剩下要做的就是......一切 -
@TheGeneral 哦,是的,公平的选择!
标签: c# loops for-loop web-scraping html-agility-pack