html 민첩성 팩은 tr의 다음 tr

c# html-agility-pack xpath

문제

나는 HTML 민첩성 팩과 관련하여 몇 가지 문제를 겪고있다. 하나 이상의 테이블에서 반복되는 같은 관련 클래스 = "관련 뉴스"를 무작위로 생성했지만, 반드시 서로를 따라 가지 않고 대부분의 시간에 그들 사이의 클래스가 없습니다. 내가 뭘 하려는지는 클래스가없는 tr의 td의 innerText를 가져 와서 그것들 바로 위에있는 tr class = "related-news"와 함께 배열에 넣는 것이다.

이것은 html입니다.

<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>

클래스가없는 tr이 얼마나 많은 클래스가 "related-news"클래스와 결합되는지를 알 수있는 방법이 없습니다. 모든 tds의 내부 텍스트를 가져와야 할 때가 있습니다. 문제가 발생할 때마다이를 분리하는 것이 좋습니다. 나는 클래스 "관련 뉴스"와 함께 tr에 도달한다.

이 같은:

tr이 "related-news"클래스를 가지고 있고, "related-news"클래스가 tr에 도달하면 클래스 "related-news"를 가지지 않는 동안이 tr의 intertext와 next tr의 innertext를 얻고 새로운 arrey를 생성하고 잇다

html 민첩성 팩으로도 가능합니까?

나는이 코드로 모든 td의 innertext를 얻는다 :

<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>

계속하거나 조건을 추가하는 방법을 모르겠습니다.

인기 답변

이것은 꽤 일반적인 작업의 징후 일뿐입니다. 순차적 목록을 거치고 여러 가지를 결합하는 것입니다.

기본적인 생각은 "관련 뉴스"노드뿐만 아니라 모든 <tr> 노드를 얻는 입니다. 그런 다음 목록을 검토하고 그룹화합니다. 아래의 의사 코드는 어떻게 완료되었는지 보여줍니다.

List<string> TextLines = new List<string>();
StringBuilder sb = new StringBuilder();
foreach (var node in nodes)
{
    if node class == "related-news"
    {
        // we've found a new "related-news" node.
        // add the previous stuff to the list
        if (sb.Length > 0)
            TextLines.Add(sb.ToString());
        sb = new StringBuilder(node.InnerText);
    }
    else
    {
        sb.Append(node.InnerText);
    }
}
// and don't forget the last one
if (sb.Length > 0)
    TextLines.Add(sb.ToString());

이 코드는 클래스 "related-news"를 가진 <tr> 태그와 그렇지 않은 태그를 처리합니다. 다르게 그룹화하려는 다른 클래스가있는 경우 코드를 수정해야합니다.




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