这是另一个编程问题,我认为一切看起来都不错,但不能按预期工作。
我想做的是使用htmlagilitypack从网页上抓取所有链接,并将其添加到数据网格中,但不要将重复项添加到数据网格中。
代码:
webBrowser.Navigate(url);
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(webBrowser.DocumentText);
if (debug)
{
Helpers.SaveDebugToFile(@"Debug\[google.com]-" + DateTime.Now.ToString("hhmmssffffff") + "-debug.html", webBrowser.DocumentText);
}
List<string> values = new List<string>();
foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
{
HtmlAttribute href = link.Attributes["href"];
if (href.Value.Contains("google.") || href.Value.Contains("search?") || href.Value.StartsWith("/") || href.Value.Length < 5)
{
// Ignore.
}
else
{
// DO NOT ADD TO THE DATAGRID IF href.Value ALREADY EXISTS IN COLUMN 1 //
values.Add(href.Value);
}
}
foreach (var value in values.Distinct().ToList())
{
DataGridViewLinks.Rows.Add(value, randomKeyword);
}
该代码有效,但是它仍在第一列中添加重复项,但是我只在其中添加了Distinct()
值(或者这就是我想要的)。
我看不到这个问题的原因,我已经看了好几次代码了,没有发现明显的错误。
编辑:
答案 0 :(得分:0)
正如上面的评论中已经提到的,很可能是内容不完全相同的地方(不同的大小写,某些前导或尾随空格,...)
更好的方法是在插入“值”列表时已经检查重复项(使用定义的大小写并删除空格)
答案 1 :(得分:0)
代替直接在for循环中使用Distinct,您可以在List中检查结果,获取所有值,然后查找问题是否出在代码的这一部分或其他任何部分。循环迭代时,可能会添加列表。