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);

c# HtmlElementCollection "拒绝访问"循环第二次迭代时出现错误消息

我认为是e.GetAttribute抛出了异常…

两件事…首先,确保在完全信任的帐户(如administrator)下运行应用程序;其次,考虑使用htmllagilitypack在HTML结构上执行操作:

http://htmlagilitypack.codeplex.com/

我的回答是,注意循环有一个元素,如果它恰好是下一个按钮,它就会点击。这个循环还在继续,但是已经加载了一个新页面,这个在页面元素循环中突然改变的页面导致了错误。所以我在点击结束后停止了循环。

发生此错误的原因是一些正在循环的HTML元素在代码中不包含所请求的属性。

例如,您可以在一些HTML代码中遍历FONT标记,并检查每个标记的COLOR属性是否包含BLUE。当循环遇到不包含所请求属性(BLUE)的元素时,就会发生错误。

要绕过这个问题,您可以尝试以下两个解决方案:

  1. 在请求之前检查正在循环的HTML元素是否包含该属性;
  2. 只需将该行(或If语句)放入Try语句中。这将防止软件崩溃,并将跳过导致错误的元素并继续循环下一个。

我强烈建议第一个解决方案