2017-02-21 42 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

謝謝你的建議,但它並沒有改變,或者至少沒有改變,因爲它應該快。也許有些東西必須完全改變,比如先加載另一端,然後再加載第一個端口,或者清理程序的緩存或類似的東西來獲取值。 順便說一句,價值已經改變,但只有像2分鐘,這是緩慢的方式一次 – Varmint

+0

雖然與你問的無關,你可以使用'定時器',而不是睡在主應用程序中導致沒有響應狀態的主線程。 – 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,但它沒有找到UsingCache。 或者我錯過了一些我必須先添加的東西? – Varmint

+0

您使用的是哪個版本的HttpAgilityPack? – Zroq

+0

據我所知,它是最新的版本。 Visual Studio說它是v4.0.30319 哦,我正在使用4.5 Framework版本,如果這是你想知道的版本 – Varmint