C # HtmlElementCollection «Доступ запрещен» сообщение об ошибке на второй итерации цикла

#c#

#c#

Вопрос:

Я использую цикл для перебора страницы поисковой системы для сбора данных, и по какой-то причине, когда я перехожу на вторую страницу результатов, мои 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);
  

Ответ №1:

Я думаю, что исключение генерирует атрибут e.getAttribute…

две вещи…во-первых, убедитесь, что вы запускаете приложение под учетной записью полного доверия, такой как администратор, и, во-вторых, рассмотрите возможность использования htmlagilitypack для выполнения действий в структуре html:

http://htmlagilitypack.codeplex.com/

Ответ №2:

Мой ответ был таким: обратите внимание, что в цикле есть элемент, на который он нажимает, если это следующая кнопка. Цикл продолжается, но была загружена новая страница, и это внезапное изменение страницы в цикле элементов страницы вызвало ошибку. Итак, я просто остановил цикл после завершения.

Ответ №3:

Причина возникновения этой ошибки заключается в том, что некоторые из зацикливаемых HTML-элементов не содержат запрошенного атрибута в коде.

Например, вы можете перебирать теги шрифтов в некотором HTML-коде и проверять, содержит ли атрибут COLOR каждого из них СИНИЙ. Ошибка произойдет, как только цикл попадет на элемент, который не содержит запрошенный атрибут (СИНИЙ).

Чтобы обойти это, вы можете попробовать эти два решения:

  1. Проверьте, содержит ли зацикливаемый HTML-элемент атрибут, прежде чем запрашивать его;
  2. Просто поместите строку (или оператор If) в оператор Try. Это предотвратит сбой программного обеспечения и пропустит элемент, вызвавший ошибку, и продолжит цикл для следующего.

Я настоятельно рекомендую первое решение.