2012-02-07 11 views
0

私はhtmlagilitypackでc#を使用しています。探しているテーブルに行が含まれていない場合を除き、すべて正常に動作します。私はページ上の最初のテーブルからデータだけを読み込もうとしています。問題は、最初のテーブルに行が含まれていない場合、何らかの理由でhtmlagilitypackが2番目のテーブルにジャンプするように見えることです。HTMLAgilityPack - 空白のテーブルを検出していますか?

私は読んしようとしているHTMLは次のようになります。

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

私は次の行使用して第一の表の値を取得:私はどのようにデータを確実ん

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

を1回目のテーブルから掴んだだけですか?

ありがとうございました。

答えて

0

テーブルまたは行を一意に識別するIDを持つ必要があります。または、xpathのidを使用します。

+0

はええ、私は私の問題が原因私が読んでいるテーブルは、それらに関連IDを持っていないという事実にあると思われると思います。 – goalie35

+0

"[@ class = 'stats']/tr [position()> 2]"と指定すると、いくつかのテストを実行しようとしましたが、各テーブルの2行目以降のすべての "stats"クラステーブルのすべての行が返されます。だから私の元の例は2行(値A |値B ...と値111 |値222)を返します。テーブル1からの行がない場合は、単純に値111 |値222を返します。テーブルがどのテーブルから来たかは気にしません。 @Chris Taylor – goalie35

+0

@ goalie35なぜ私はdownvotedですか?私はあなたのコメントがChirs Taylorを対象としていたので、間違った答えにあなたのコメントを投稿したと思います。 –

1

テーブルセレクタの後に位置インデックス[1]を使用して、最初に一致するテーブルのみを確実に選択できます。

は、以下のことを試してみてください。

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

最初のテーブルが行を持っていない場合は、foreachに反復する前に、それをチェックする必要がありますので、その後、あなたが戻ってnullを取得します。

たとえば次のような操作が必要になります:

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

+0

問題を示すサンプルHTMLを提供できますか?私はあなたの質問のサンプルを使用してテストし、を最初のテーブルから削除し、SelectNodesのnullを得ました。これはあなたが必要と理解しているものです。 –

+0

実際のコードはここで許容される文字の合計よりも長いので、ここでは私が読もうとしているページです。それはページの途中にある "class = 'statstable'"を持つ最初のテーブルです。この第1の表(「シーズン統計」と呼ばれる)には2つのヘッダー行が含まれていますが、データ行はありません。私はデータ行が存在しないときを判断できるようにする必要があります:http://www.rotoworld.com/player/mlb/6633/luis-jimenez
もう一度ありがとうございます。 – goalie35

関連する問題