c# HtmlElementCollection "拒绝访问"循环第二次迭代时出现错误消息
本文关键字:quot 错误 消息 循环 HtmlElementCollection 拒绝访问 第二次 迭代 | 更新日期: 2023-09-27 18:14:34
我使用循环遍历搜索引擎页面来收集数据,并且由于某些原因,当我导航到结果的第二页时,我的HtmlElementCollection和Regex。匹配函数出现以下错误:
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
这是我的循环代码的副本。你能告诉我怎么做,什么可能导致这个问题吗?
while (((WebBrowser)browser).Document.GetElementById("pg-next")!=null)
{
//MessageBox.Show("hello");
HtmlElementCollection col = default(HtmlElementCollection);
col = ((WebBrowser)browser).Document.GetElementsByTagName("a");
foreach (HtmlElement e in col)
{
match = Regex.Match(e.GetAttribute("href").ToString(), @"mysite.com", RegexOptions.IgnoreCase);
if (match.Success)
{
this_url = e.GetAttribute("href").ToString();
//MessageBox.Show(this_url);
match = Regex.Match(this_url, @"mysite.com", RegexOptions.IgnoreCase);
this_url = "https://"+match;
//domorestuff
}
if ((e.GetAttribute("innerHTML").ToString().Contains("Next ")))
{
f_perform_operation_on_element (e, "click", null);
f_sleep(2);
}
}
}
我目前唯一的线索,它可能完全错误,是htmlelementcollection期望有以前的页面元素,但因为我声明一个全新的集合,有些东西搞砸了。我真的很困惑。
访问被拒绝:
match = Regex.Match(e.GetAttribute("href").ToString(), @"mysite.com", RegexOptions.IgnoreCase);
我认为是e.GetAttribute抛出了异常…
两件事…首先,确保在完全信任的帐户(如administrator)下运行应用程序;其次,考虑使用htmllagilitypack在HTML结构上执行操作:
http://htmlagilitypack.codeplex.com/我的回答是,注意循环有一个元素,如果它恰好是下一个按钮,它就会点击。这个循环还在继续,但是已经加载了一个新页面,这个在页面元素循环中突然改变的页面导致了错误。所以我在点击结束后停止了循环。
发生此错误的原因是一些正在循环的HTML元素在代码中不包含所请求的属性。
例如,您可以在一些HTML代码中遍历FONT标记,并检查每个标记的COLOR属性是否包含BLUE。当循环遇到不包含所请求属性(BLUE)的元素时,就会发生错误。要绕过这个问题,您可以尝试以下两个解决方案:
- 在请求之前检查正在循环的HTML元素是否包含该属性;
- 只需将该行(或If语句)放入Try语句中。这将防止软件崩溃,并将跳过导致错误的元素并继续循环下一个。
我强烈建议第一个解决方案