我正在开发图像挖掘项目,我使用Hashset而不是数组来避免在收集网址时添加重复的网址,我达到了代码点来迭代包含主网址的Hashset,并且在迭代中我去了并下载主URL的页面并将它们添加到Hashet,然后继续,并且在迭代期间我应该排除每个扫描的URL,并且还排除(删除)以jpg结尾的每个url,这直到url计数的Hashet达到0,问题是我在这个迭代中面临无限循环,我可能会得到url(让我们称之为X)
1-我扫描网址X的页面 2-获取第X页的所有网址(通过应用过滤器) 3-使用unioinwith将URL添加到Hashset 4-删除扫描的URL X
问题来自此处,当其中一个网址Y被扫描时再次带来X
我应该使用Dictionary和密钥作为“扫描”吗?我会尝试在这里发布结果,抱歉,在我发布问题之后,我想到了......
我设法解决了一个网址,但似乎它与其他网址一起生成循环,所以如何处理Hashset以避免重复,即使删除链接,,, 我希望我的观点是清楚。
while (URL_Can.Count != 0)
{
tempURL = URL_Can.First();
if (tempURL.EndsWith("jpg"))
{
URL_CanToSave.Add(tempURL);
URL_Can.Remove(tempURL);
}
else
{
if (ExtractUrlsfromLink(client, tempURL, filterlink1).Contains(toAvoidLoopinLinks))
{
URL_Can.Remove(tempURL);
URL_Can.Remove(toAvoidLoopinLinks);
}
else
{
URL_Can.UnionWith(ExtractUrlsfromLink(client, tempURL, filterlink1));
URL_Can.UnionWith(ExtractUrlsfromLink(client, tempURL, filterlink2));
URL_Can.Remove(tempURL);
richTextBox2.PerformSafely(() => richTextBox2.AppendText(tempURL + "\n"));
}
}
toAvoidLoopinLinks = tempURL;
}
答案 0 :(得分:0)
感谢All,我设法使用Dictionary而不是Hashset来解决这个问题,并使用Key来保存URL,并且如果网址被扫描则保持int的值为1,如果网址仍为0则使用0没有处理,下面是我的代码。 我使用了另一个字典" URL_CANtoSave来保存以jpg结尾的网址"我的目标" ...这个循环的While..can循环直到网站的所有网址都用完了您在过滤器字符串变量中指定的值,您可以相应地解析URL。
因此,为了打破循环,您可以指定URL_CantoSave中获取的图像数量。
return Task.Factory.StartNew(() =>
{
try
{
string tempURL;
int i = 0;
//我以前设置了字典键的值,1或0(1表示已扫描, 0表示尚未进行迭代,直到扫描完所有Dictionry键,或者根据您在其他词典中收集的图像数量在中间中断
while (URL_Can.Values.Where(value => value.Equals(0)).Any())
{
//取1键并将其放入临时变量
tempURL = URL_Can.ElementAt(i).Key;
//检查它是否以目标文件扩展名结尾。在这种情况下图像文件
if (tempURL.EndsWith("jpg"))
{
URL_CanToSave.Add(tempURL,0);
URL_Can.Remove(tempURL);
}
//如果不是图像,则根据网址下载页面并继续分析
else
{
//如果之前未扫描的网址
if (URL_Can[tempURL] != 1)
{
//这里看起来很复杂,Add2Dic是添加到词典的过程而不再添加Key(解决主要问题!!) " ExtractURLfromLink"是另一个返回字典的过程,通过下载URL的文档字符串并分析它来分析所有链接, 您可以根据分析添加删除过滤器字符串
Add2Dic(ExtractUrlsfromLink(client, tempURL, filterlink1), URL_Can, false);
Add2Dic(ExtractUrlsfromLink(client, tempURL, filterlink2), URL_Can, false);
URL_Can[tempURL] = 1; // to set it as scanned link
richTextBox2.PerformSafely(() => richTextBox2.AppendText(tempURL + "\n"));
}
}
statusStrip1.PerformSafely(() => toolStripProgressBar1.PerformStep());
//这里有另一个技巧,让这个迭代继续进行,直到它扫描所有收集的链接
i++; if (i >= URL_Can.Count) { i = 0; }
if (URL_CanToSave.Count >= 150) { break; }
}
richTextBox2.PerformSafely(() => richTextBox2.Clear());
textBox1.PerformSafely(() => textBox1.Text = URL_Can.Count.ToString());
return ProcessCompleted = true;
}
catch (Exception aih)
{
MessageBox.Show(aih.Message);
return ProcessCompleted = false;
throw;
}
{
richTextBox2.PerformSafely(()=>richTextBox2.AppendText(url+"\n"));
}
})