在我的应用程序中,我使用scrape(string url)
方法从网页上抓取链接。让我们说它每次都会给我回复10个网址。
我想从每个抓取的网址中抓取10个链接。
长话短说:
(步骤1)转到网页并抓取10个链接
(步骤2)从步骤1开始的foreach链接进入网页并抓取10个链接
对于步骤2中的每个链接,(步骤3)转到网页并抓取10个链接。
所以它会给我10 + 100 + 1000个链接= 1110。
当然我可以这样做:
List<string> links1 = new List<string>();
List<string> links2 = new List<string>();
List<string> links3 = new List<string>();
links1 = scrape("example.com"); //get 10 links
foreach (string link in links1)
{
List<string> temp = new List<string>();
temp = scrape(link);
links2.AddRange(temp);
} //get 100 links
foreach (string link in links2)
{
List<string> temp = new List<string>();
temp = scrape(link);
links3.AddRange(temp);
} // get 1000 links
但编辑很糟糕。如果我想刮掉链接10次怎么办?我必须制作10个foreach
循环。
你能给我任何建议吗?
答案 0 :(得分:3)
递归功能将是您最好的选择。但是,您需要传递一个参数来跟踪&#34;有多深&#34;你是在刮你或者你可能最终爬上整个公共网站。
public List<string> GetLinks(List<string> urls, int depth){
var newUrls = new List<string>();
if(depth == 0) return newUrls ;
foreach(var url in urls){
newUrls.AddRange(scrape(url));
}
return urls.AddRange(GetLinks(newUrls, depth - 1);
}
答案 1 :(得分:1)
您需要使用递归。
这里的想法是继续调用相同的函数,直到没有孩子离开。递归的一个例子是在treelist函数中的FindTreeNode中:
Public Function quartre(d As Date) As Integer
Dim m As Integer
m = Month(d)
quartre = ((m - 1) Mod 3) + 1
End Function
与上面相同的想法,除了你的情况,它与web uri