2017-02-21 2 views
-1

С тех пор, как я кодирую на C#, и я пытаюсь создать пару небольших инструментов для себя и своих друзей, но у меня возникла проблема, которая мешает мне продолжать.C# HtmlAgilityPack Обновить значение

Проблема в этом. Я хочу использовать HmtlAgilityPack, чтобы получить изменяющееся значение, чтобы использовать его для нескольких разных действий. Но проблема в том, что значение зацикливается на одном и том же значении до тех пор, пока я не перезапущу программу.

Так вот код, я использую:

public static void Main(string[] args) 
    { 
     Console.WriteLine("Running the program!"); 
     Console.WriteLine("Reading the value!"); 
     int i = 0; 
     string url = "Website"; 
     while (i < 300) 
     { 
      i++; 
      HtmlWeb web = new HtmlWeb(); 
      HtmlDocument LoadWebsite = web.Load(url); 
      HtmlNode rateNode = LoadWebsite.DocumentNode.SelectSingleNode("//div[@class='the-value']"); 
      string rate = rateNode.InnerText; 
      Console.WriteLine(i + ". " + rate); 
      Thread.Sleep(1000); 

     } 
     Console.WriteLine("Done"); 
     Console.ReadLine(); 
    } 

Так вот первый загружает веб-сайт. Затем он получает значение из div. После этого он записывает значение, чтобы проверить его. Но он просто пишет одно и то же значение.

Мой вопрос здесь в том, что я не знаю, что мне нужно изменить, чтобы получить новое значение, потому что значение меняется каждые несколько секунд, и мне нужно последнее значение с моего сайта. Это похоже на значение, необходимое для поддержания работы системы.

+0

После 'Thread.Sleep', все ясно, т.е.' веб = null', 'LoadWebsite = null' и проверить следующую итерацию дает ли вам ту же запись или нет. –

+0

Спасибо за предложение, но оно не изменилось или, по крайней мере, оно не изменилось так быстро, как должно. Возможно, есть что-то, что нужно полностью изменить, как сначала загрузить другую сторону, а затем снова загрузить первый или очистить кэш программы или что-то в этом роде, чтобы прокатиться по значению. Btw Значение изменилось, но только как раз в 2 минуты, что является способом замедления – Varmint

+0

Несмотря на то, что вы не заданы вопросом, вы можете использовать 'Timer' вместо спящего основного потока, который вызывает не отвечающий статус в приложении. – mcy

ответ

0

Объявите свой HtmlWeb web = new HtmlAgilityPack.HtmlWeb(); вне цикла, нет необходимости создавать для каждого цикла. У вас могут возникнуть проблемы с кэшированием на веб-сайте, который вы хотите обходить.

web.UsingCache = false;.

Если это не работает, добавьте некоторую случайную строку, чтобы каждый вызов был другим.

Код:

HtmlWeb htmlWeb = new HtmlAgilityPack.HtmlWeb(); 
htmlWeb.UsingCache = false; 
int i = 0; 
while (i < 300) 
{ 
    var uri = new Uri($"yoururl?z={Guid.NewGuid()}"); 
    i++; 
    HtmlAgilityPack.HtmlDocument LoadWebsite = htmlWeb.Load(uri.AbsoluteUri); 
    HtmlNode rateNode = LoadWebsite.DocumentNode.SelectSingleNode("//div[@class='the-value']"); 
    string rate = rateNode.InnerText; 
    Console.WriteLine(i + ". " + rate); 
    Thread.Sleep(1000); 
} 
+0

htmlWeb.UsingCache = false; не работает для меня. Я могу использовать HtmlWeb, но тогда он не находит UseCache. Или мне не хватает чего-то, что я должен добавить первым? – Varmint

+0

Какую версию HttpAgilityPack вы используете? – Zroq

+0

Насколько я вижу, это самая последняя версия. Visual Studio говорит, что это v4.0.30319 О, и я использую версию 4.5 Framework, если это тот, который вы хотите знать – Varmint

Смежные вопросы