我正在尝试使用HTML Agility Pack获取“Pool Hashrate”的值。当我点击我的字符串哈希时,我得到Object reference not set to an instance of an object
。有人能告诉我我做错了吗?
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 :(得分:2)
假设您正在尝试访问该网址,当然它应该会失败。该url不会返回完整的文档,只是html的一个片段。没有html
标记,没有body
标记,只有div
。您的xpath查询不返回任何内容,因此返回null引用异常。你需要查询正确的事情。
当我访问该网址时,它会返回:
<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
}
答案 1 :(得分:1)
问题是xpath没有找到指定的节点。您可以为表或tr指定id以获得更小的xpath
另外,根据你的代码,我假设你只是在寻找一个节点,所以你可能想要使用这样的东西
doc.DocumentNode.SelectSingleNode( “的xpath”);
另一个不错的选择是使用Fizzler