HTML + HTMLAgilitypack에서 다음 2 노드를 얻는 방법

c# html-agility-pack

문제

아래 HTML 코드에 테이블이 있습니다.

<table style="padding: 0px; border-collapse: collapse;">
    <tr>
        <td><h3>My Regional Financial Office</h3></td>
    </tr>
    <tr>
        <td>&#160;</td>
    </tr>
    <tr>
        <td><h3>My Address</h3></td>
    </tr>
    <tr>
        <td>000 Test Ave S Ste 000</td>
    </tr>
    <tr>
        <td>Golden Valley, MN 00000</td>
    </tr>
    <tr>
        <td><a href="javascript:submitForm('0000','0000000');">Get Directions</a></td>
    </tr>
    <tr>
        <td>&#160;</td>
    </tr>
</table>

"My Address?"텍스트가 포함 된 tablerow 뒤에 다음 2 <tr> 태그의 내부 텍스트를 가져 오는 방법은 무엇입니까?

수락 된 답변

다음 XPath를 사용할 수 있습니다.

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
var tdOfInterests = 
        htmlDoc.DocumentNode
               .SelectNodes("//tr[td/h3[.='My Address']]/following-sibling::tr[position() <= 2]/td");
foreach (HtmlNode td in tdOfInterests)
{
    //given html input in question following code will print following 2 lines:
    //000 Test Ave S Ste 000
    //Golden Valley, MN 00000
    Console.WriteLine(td.InnerText);
}

위의 XPath의 핵심은 position() 필터로 following-sibling 를 사용하고 있습니다.

업데이트 :

이 답변에 사용 된 XPath에 대한 약간의 설명 :

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
var tdOfInterests = 
        htmlDoc.DocumentNode
               .SelectNodes("//tr[td/h3[.='My Address']]/following-sibling::tr[position() <= 2]/td");
foreach (HtmlNode td in tdOfInterests)
{
    //given html input in question following code will print following 2 lines:
    //000 Test Ave S Ste 000
    //Golden Valley, MN 00000
    Console.WriteLine(td.InnerText);
}

위의 파트는 다음을 포함하는 <tr> 요소를 선택합니다.

  • 값이 'My Address'인 하위 <h3> 요소가있는 하위 <td> 요소

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
var tdOfInterests = 
        htmlDoc.DocumentNode
               .SelectNodes("//tr[td/h3[.='My Address']]/following-sibling::tr[position() <= 2]/td");
foreach (HtmlNode td in tdOfInterests)
{
    //given html input in question following code will print following 2 lines:
    //000 Test Ave S Ste 000
    //Golden Valley, MN 00000
    Console.WriteLine(td.InnerText);
}

다음 파트는 현재 <tr> 요소 (이전 XPath 부분에서 선택한 요소) 에서 위치가 <= 2 인 <tr> 요소 다음에 오는 요소를 선택합니다.

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
var tdOfInterests = 
        htmlDoc.DocumentNode
               .SelectNodes("//tr[td/h3[.='My Address']]/following-sibling::tr[position() <= 2]/td");
foreach (HtmlNode td in tdOfInterests)
{
    //given html input in question following code will print following 2 lines:
    //000 Test Ave S Ste 000
    //Golden Valley, MN 00000
    Console.WriteLine(td.InnerText);
}

마지막 부분은 현재 <tr> 요소의 자식 <td> 요소를 선택합니다.




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