HTML 민첩성 팩과 Linq로 html 구문 분석하기

c# html-agility-pack html-parsing linq

문제

나는 다음과 같은 HTML을 가지고있다.

(..)
<tbody>
 <tr>
  <td class="name"> Test1 </td>
  <td class="data"> Data </td>
  <td class="data2"> Data 2 </td>
 </tr>
 <tr>
  <td class="name"> Test2 </td>
  <td class="data"> Data2 </td>
  <td class="data2"> Data 2 </td>
 </tr>
</tbody>
(..)

내가 가지고있는 정보는 => "Test1"& "Test2"라는 이름입니다. 내가 알고 싶은 것은 내가 가지고있는 이름을 기반으로 "데이터"와 "데이터 2"에있는 데이터를 어떻게 얻을 수 있는가입니다.

현재 사용하고있는 것은 :

(..)
<tbody>
 <tr>
  <td class="name"> Test1 </td>
  <td class="data"> Data </td>
  <td class="data2"> Data 2 </td>
 </tr>
 <tr>
  <td class="name"> Test2 </td>
  <td class="data"> Data2 </td>
  <td class="data2"> Data 2 </td>
 </tr>
</tbody>
(..)

하지만 {"Object reference not set to an instance of an object."} data 를 살펴볼 때

수락 된 답변

시도에 관해서는 코드에 두 가지 문제가 있습니다.

  1. ChildNodes 는 이상하다. class 속성을 가지고 있지 않은 공백 텍스트 노드를 반환한다. (당연히 속성을 가질 수 없다.)
  2. James Walford가 언급했듯이 텍스트 주변의 공백은 중요합니다.

이 두 가지 수정 사항을 통해 다음과 같은 작업을 수행 할 수 있습니다.

var data =
      from tr in doc.DocumentNode.Descendants("tr")
      from td in tr.Descendants("td").Where(x => x.Attributes["class"].Value == "name")
     where td.InnerText.Trim() == "Test1"
    select tr;

인기 답변

여기 XPATH 방식입니다 - 음 ... 모든 사람들이 XPATH의 힘을 잊어 버렸고 독점적으로 C # XLinq에 집중하고있는 것 같습니다 :-)

이 함수는 이름과 관련된 모든 데이터 값을 가져옵니다.

public static IEnumerable<string> GetData(HtmlDocument document, string name)
{
    return from HtmlNode node in
        document.DocumentNode.SelectNodes("//td[@class='name' and contains(text(), '" + name + "')]/following-sibling::td")
        select node.InnerText.Trim();
}

예를 들어,이 코드는 모든 'Test2'데이터를 덤프합니다.

public static IEnumerable<string> GetData(HtmlDocument document, string name)
{
    return from HtmlNode node in
        document.DocumentNode.SelectNodes("//td[@class='name' and contains(text(), '" + name + "')]/following-sibling::td")
        select node.InnerText.Trim();
}



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