循环的第二次迭代时,C#HtmlElementCollection“访问被拒绝”错误消息

时间:2011-11-11 19:52:26

标签: c#

我正在使用循环来遍历搜索引擎页面来收集数据,出于某种原因,当我导航到结果的第二页时,我的HtmlElementCollection和Regex.Match函数出现了这个错误:

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

3 个答案:

答案 0 :(得分:1)

我认为这是e.GetAttribute抛出异常...

两件事......首先,确保您在管理员等完全信任帐户下运行应用程序,然后考虑使用htmlagilitypack在html结构上执行操作:

http://htmlagilitypack.codeplex.com/

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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

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