2012-02-07 2 views
0

나는 htmlagilitypack과 함께 C#을 사용하고 있습니다. 찾고있는 테이블에 행이없는 경우를 제외하고 모두 잘 작동합니다. 페이지의 첫 번째 테이블에서 데이터 만 읽으려고합니다. 문제는 첫 번째 테이블에 행이 없으면 htmlagilitypack이 어떤 이유로 두 번째 테이블로 이동하는 것입니다. 어떻게 데이터 I를 보장 할HTMLAgilityPack - 빈 표 검색 중입니까?

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> 

내가 다음 줄을 사용하여 1 차 테이블의 값을 검색 :

내가 읽어 노력하고있어 HTML은 다음과 같이 보입니다 첫 번째 테이블에서만 잡는거야?

감사합니다.

답변

0

테이블을 고유하게 식별하는 테이블 또는 행에 ID가 있어야하며, 또는 xpath에서 id를 사용해야합니다.

+0

그래, 난 내 문제로 인해 내가 읽고 있어요 테이블은 그와 관련된 아이디의이없는 사실을 것 같다 생각합니다. – 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]을 사용하여 첫 번째로 일치하는 표만 선택하도록 할 수 있습니다.

는 다음과 같은 시도 : 첫 번째 테이블에 행이없는 경우에는 foreach에 반복하기 전에 확인해야하므로

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

, 당신은 다시 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에 대해 널 알아 냈어. –

+0

실제 코드는 여기에 허용되는 총 문자 수보다 길기 때문에 여기에 내가 읽으려고하는 페이지가 있습니다. 그것은 페이지의 중간에 "class = 'statstable'"이있는 첫 번째 테이블입니다. 이 첫 번째 표 ("시즌 통계"라고 함)에는 2 개의 머리글 행이 있지만 데이터 행이 없으므로 문제가 발생합니다. 데이터 행이 없을 때를 결정할 수 있어야합니다. http://www.rotoworld.com/player/mlb/6633/luis-jimenez
다시 한번 감사드립니다. – goalie35