Html Agility Pack으로 노드를 선택하는 데 문제가 있습니다.

c# html html-agility-pack

문제

현재 HTML 레이아웃이 있습니다.

<table> //table[1]
</table>
<table> //table[2]
<tbody>
   <tr>
      <td>
         <p>
            &nbsp;
         </p>
      </td>
   </tr>
   <tr>
      <td>
         <table> //table[1]//table[1]
            <tbody>
               <tr>
                  <td>
                     <p>
                        INFO 1
                     </p>
                  </td>
                  <td>
                     <p>
                        INFO 2
                     </p>
                  </td>
                  <td>
                     <p>
                        INFO 3
                     </p>
                  </td>
                  <td>
                     <p>
                        INFO 4
                     </p>
                  </td>
               </tr>
            </tbody>
         </table>
      </td>
   </tr>
   <tr>
      <td>
         <table> //table[1]//table[2]
            <tbody>
               <tr>
                  <td>
                     <p><strong>Name</strong></p>
                  </td>
                  <td>
                     <p><strong>Quantity</strong></p>
                  </td>
               </tr>
               <tr>
                  <td>
                     <p>Apples </p>
                  </td>
                  <td>10</td>
               </tr>
            </tbody>
         </table>
      </td>
   </tr>
   <tr>
      <td>
         <table>  //table[1]//table[3]
         </table>
      </td>
   </tr>
</tbody>
</table>

//table[1]//table[2] 내에있는 데이터를 가져 오려고하지만 아직 다음과 같은 경우 null HtmlNode ( System.NullReferenceException )가 계속 발생합니다.

does not ': doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[2]//tbody//tr"); ,

나는 왜이 문법으로 잘 작동하는지 //table[1]//table[1] 대한 데이터를 얻으려고 할 때 왜 이것이 발생하는지 확신하지 못한다.

작품 : doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr//td//table[1]//tbody//tr");

Html Agility Pack에서 색인 생성이 어떻게 작동하는지 오해하고 있습니까?

수락 된 답변

//table[2] 는 XPath로 인해 같은 부모에서 두 번째 <table> 요소를 반환 <table> .

( [] )의 우선 순위는 ( /// )보다 높습니다. [ 참고 용 ]

귀하의 경우 각 <td> 에는 하나의 <table> 만 있으므로 Xpath 표현식은 아무 것도 반환하지 않습니다. 한 가지 가능한 해결책은 우선 순위를 변경하기 위해 대괄호를 사용하는 것입니다.

(//table[2]//tbody//tr//td//table)[2]//tbody//tr

Xpath 위에는 내부 XPath //table[2]//tbody//tr//td//table 의해 반환 된 모든 <table> 의 두 번째 <table> 요소를 가져옵니다. 그런 다음 해당 <table> 에서 하위 항목 //tbody//tr 요소를 계속 반환합니다.


인기 답변

나는 tr 의 이것의 기초가되는 것을 끝내야 tr 왜 나의 다른 길은 효과가 없었는지 모르지만,이 방법은 효과가있다.

기본적으로 색인 생성을 내 테이블 위의 다음 단계로 옮겼습니다. 그래서 첫 번째 tbody 내에서 각 테이블은 tr / td 문 안에 있고, 나는 단순히 tr 의 인덱스를 만들기 위해 HtmlNode를 만들었습니다. 아마 당신이 선택 과정을 넓히면 민첩 팩이 더 잘 작동할까요? IDK.

어쨌든 ...

table[2]//table[1] 나는 다음을 사용했다 :

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[2]//table");
foreach (var cell in table.SelectNodes(".//tr//td/p"))
...

내가 위의 예제 HTML을 적어두기 전에 공란으로 tr / td를 사용하기 전에 tr [2]를 선택했습니다.

table[2]//table[2]

HtmlNode table = doc.DocumentNode.SelectSingleNode("//table[2]//tbody//tr[2]//table");
foreach (var cell in table.SelectNodes(".//tr//td/p"))
...

문제가있는 사람은 특정 태그를 더 넓은 태그로 이동하여 검색 범위를 넓혀보십시오.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.