2011-06-11 61 views
0

我想从这里得到的球员名单:的XPath/HTMLAgilityPack问题

http://www.basketball-reference.com/boxscores/201105090BOS.html

要做到这一点的第一个表,我使用以下命令:

HtmlNode reboundsNode = doc.DocumentNode.SelectSingleNode("//table[@class='sortable stats_table']/tbody[1]"); 
    foreach(HtmlNode node in reboundsNode.SelectNodes("tr")) 
    { 
     // Get the 'td's. 
    } 

我不得不把它分解分成两行,因为"//table[@class='sortable stats_table']/tbody[1]/tr"从所有表格体中选择了tr s,而不是第一个。有谁知道为什么?

我从第二个表中获取数据时也遇到问题(实际上源表中的表号3,因为表2和表4在默认视图中不可见)。当我选择"//table[@class='sortable stats_table']"时,它显示有四个表格,但是当我做"//table[@class='sortable stats_table'][3]"时,它找不到任何东西(当我尝试使用结果时,我得到一个未绑定的对象异常。为什么?

回答

2

因为XPath []是不是一个数字表身,但病情,所以1意味着总是如此 - 试试这个 - 它将从第一TBODY

//table[@class='sortable stats_table']/tbody[position() = 1]/tr 

第二个问题选择

//table[@class='sortable stats_table'][3] 

这是无效的XPath - 写正确的方法这是

//table[@class='sortable stats_table' and position() = 3] 

注意:位置从1开始,而不是从0开始,以元素计数结束。

+0

奇怪。那么为什么[N]符号为我多种其他表达方式? – Hui 2011-06-11 15:44:58

+0

我不知道(也许有些MS选项等等),但它对XPath无效,它对于JavaScript,C,PHP有效...... – SergeS 2011-06-12 12:51:31

+0

[N]子标记确实对XPath有效,例如, 'para [1]选择上下文节点的第一个子节点“请参阅 http://www.w3.org/TR/xpath/#path-abbrev – agentnega 2013-02-25 22:26:56