2013-12-17 70 views
0

我想要使用Html Agility Pack獲得「Pool Hashrate」的價值。正確的時候,當我打我的字符串散列我得到{「對象引用未設置爲對象的實例。」}。誰能告訴我什麼我做錯了使用Html Agility Pack從網頁獲取價值

string url = http://p2pool.org/ltcstats.php?address 

protected void Page_Load(string address) 
    { 
     string Url = address; 
     HtmlWeb web = new HtmlWeb(); 
     HtmlDocument doc = web.Load(Url); 

     string hash = doc.DocumentNode.SelectNodes("/html/body/div/center/div/table/tbody/tr[1]")[0].InnerText; 
    } 
+0

我相信的HTML敏捷性包是基於1。我會分解它,並離開InnerText,然後在你的節點上做一個foreach並調試,看看你是否有任何節點以及它們是什麼。 – Harrison

+0

我有一個類似的問題,檢查了出來(http://stackoverflow.com/questions/30805833/inspect-element-from-my-wpf-webbrowser-using-inspect-elementsie-chrome-fir) – user254197

回答

2

假設你試圖訪問的URL,當然它應該失敗。該網址不會返回完整文檔,而只是html的一個片段。沒有html標籤,沒有body標籤,只是div。您的xpath查詢不會返回任何內容,因此返回空引用異常。你需要查詢正確的事情。

當我訪問該網址,它返回:

<div> 
    <center> 
     <div style="margin-right: 20px;"> 
     <h3>Personal LTC Stats</h3> 
     <table class='zebra-striped'> 
     <tr><td>Pool Hashrate: </td><td>66.896 Mh/s</td></tr> 
     <tr><td>Your Hashrate: </td><td>0 Mh/s</td></tr> 
     <tr><td>Estimated Payout: </td><td> LTC</td></tr> 
     </table> 
     </div> 
    </center> 
</div> 

鑑於此,如果你想獲得Pool Hashrate,你會使用一個查詢更多這樣的:

/div/center/div/table/tr[1]/td[2] 

在最後,你需要做到這一點:

var url = "http://p2pool.org/ltcstats.php?address"; 
var web = new HtmlWeb(); 
var doc = web.Load(url); 
var xpath = "/div/center/div/table/tr[1]/td[2]"; 
var poolHashrate = doc.DocumentNode.SelectSingleNode(xpath); 
if (poolHashrate != null) 
{ 
    var hash = poolHashrate.InnerText; 
    // do stuff with hash 
} 
+0

我看到的HTML和身體標籤當我看它 – Harrison

+0

好吧,如果你通過瀏覽器打開它,瀏覽器將添加這些。請直接訪問該站點再試一次。 –

1

的問題是,XPath是沒有找到SPE規定節點。你可以指定一個id到表或tr,以便有一個更小的xpath

另外,根據你的代碼,我假設你只是在尋找一個單一的節點,所以你可能想用這樣的東西

doc.DocumentNode.SelectSingleNode(「xpath」);

另一個很好的選擇是使用Fizzler

相關問題