2012-02-07 70 views
0

我正在使用c#與htmlagilitypack。除了當我查找的表不包含行時,一切正常。我試圖只讀取頁面上第一個表格中的數據。問題是如果第一個表不包含行,htmlagilitypack似乎由於某種原因跳到第二個表。HTMLAgilityPack - 檢測空白表?

我想閱讀HTML看起來是這樣的:

foreach (HtmlNode node in root.SelectNodes("//table[@class='stats']/tr[position() > 2]/td")) 

如何確保數據我:

<table class='stats'> 
    <tr> 
     <td colspan='2'>This is the 1st table</td> 
    <tr> 
     <td>Column A</td> 
     <td>Column B</td> 
    </tr> 
    <tr> 
     <td>Value A</td> 
     <td>Value B</td> 
    </tr> 
</table> 

<table class='stats'> 
    <tr> 
     <td colspan='2'>This is the 2nd table</td> 
    <tr> 
     <td>Column 1</td> 
     <td>Column 2</td> 
    </tr> 
    <tr> 
     <td>Value 111</td> 
     <td>Value 222</td> 
    </tr> 
</table> 

然後我用下面的行檢索第一表中的值抓住只是從第一桌?

謝謝。

回答

0

您需要在表或行的唯一標識表或or上使用id,然後在xpath中使用id。

+0

嗯,我想我的問題似乎是由於這樣的事實,我在看錶沒有與之相關的ID。 – goalie35 2012-02-07 20:12:53

+0

我試着運行一些測試,當我指定「[@ class ='stats']/tr [position()> 2]」時,它會在每個表的第2行之後返回所有「stats」類表的所有行。所以,我最初的例子返回2行(值A |值B ...和值111 |值222)。如果表1中沒有行,則它僅返回值111 |值222。它似乎不關心它來自哪個表。 @克里斯泰勒 – goalie35 2012-02-07 20:19:39

+0

@ goalie35爲什麼我低調?我想你的評論是針對Chirs Taylor的。 – 2013-03-26 14:05:40

1

您可以確保只使用表選擇器後的位置索引[1]來選擇第一個匹配表。

嘗試以下操作:

"//table[@class='stats'][1]/tr[position()>2]/td" 

如果第一個表沒有行,那麼你會得到null回來,所以你應該在foreach迭代之前檢查這一點。

例如,你可能要做到以下幾點:

var elements = root.SelectNodes("//table[@class='stats'][1]/tr[position()>2]/td"); 
if (elements != null) 
{ 
    foreach (HtmlNode node in elements) 
    { 
    // process the td node 
    } 
} 
+0

感謝您的回覆。不幸的是,這不起作用。這似乎是沒有指定表ID的問題。 – goalie35 2012-02-07 20:20:57

+0

你能否提供一個演示問題的HTML示例?我使用你問題中的示例進行了測試,並從第一個表中刪除了,SelectNodes得到了空值,這是我理解你需要的。 – 2012-02-08 04:22:22

+0

實際代碼比這裏允許的總字符長,所以這裏是我正在嘗試閱讀的頁面。這是第一張帶有「class ='statstable'」的表格,大約在頁面的中間。這第一個表(稱爲「季節統計」)包含2個標題行,但沒有數據行,這是我遇到我的問題。我需要能夠確定何時不存在數據行:http://www.rotoworld.com/player/mlb/6633/luis-jimenez
再次感謝。 – goalie35 2012-02-08 15:44:37