使用Html Agility Pack从网页获取价值

时间:2013-12-17 02:35:01

标签: c# c#-4.0

我正在尝试使用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;
}

2 个答案:

答案 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