我正在写一个基于HTMLAgilityPack
和Fizzler
的简单搜寻器,以便检查网页上是否存在关键字及其对应的子链接。然后,对所有深度达50级的子链接重复相同的过程。使数字呈指数增长。
问题是我想将我编写的方法转换为递归方法,但是它不起作用-在第一个链接后卡住,而且工作速度很慢。
这是我目前所做的:
public static void GetAllLinks(HtmlWeb web, List<string> relevantLinks, string inputLink)
{
string mainLink = "http://www.cnet.com";
Console.WriteLine("Current count of links: " + relevantLinks.Count + "\tCurrent link: " + inputLink);
HtmlDocument html = web.Load(inputLink);
HtmlDocument htmlInner = new HtmlDocument();
html.DocumentNode.Descendants()
.Where(n => n.Name == "script" || n.Name == "style")
.ToList()
.ForEach(n => n.Remove());
var text = htmlInner.DocumentNode.InnerText.ToLower();
text = Regex.Replace(text, @"\r\n?|\n", "");
text = Regex.Replace(text, " {2,}", " ");
text = text.Trim();
if (text.Contains("microsoft"))
{
if (!relevantLinks.Contains(inputLink))
{
relevantLinks.Add(inputLink);
}
}
var linkTagsList = html.DocumentNode.QuerySelectorAll("a").ToList();
foreach (var linkTag in linkTagsList)
{
if (linkTag.Attributes["href"] != null)
{
var link = linkTag.Attributes["href"].Value;
// Check if the link found is the sublink of the main link
if (!link.Contains(mainLink))
{
// Check if only partial link then concat with main one
if (link.Substring(0, 1) == "/")
{
if (inputLink.Substring(inputLink.Length - 1, 1) == "/")
inputLink = inputLink.Substring(0, inputLink.Length - 1);
link = inputLink + link;
}
else
{
link = String.Empty;
}
}
if (!string.IsNullOrEmpty(link))
{
Console.WriteLine(link);
GetAllLinks(web, relevantLinks, link);
}
}
}
}
任何提示或建议都将受到高度赞赏。