Html Agility Pack을 사용하여 테이블 구문 분석

c# html-agility-pack

문제

나는 약간의 테이블을 가지고있다.

<table>
        <tr class="odd">
        <td class="ind gray">1</td>
        <td><b>acceding</b></td>
        <td class="transcr">[əksˈiːdɪŋ]</td>
        <td class="tran">присоединения</td>
      </tr>
<!-- .... -->
        <tr class="odd">
        <td class="ind gray">999</td>
        <td><b>related</b></td>
        <td class="transcr">[rɪlˈeɪːtɪd]</td>
        <td class="tran">родственный</td>
      </tr>
</table>

한 행에 3 개의 "td"를 파싱하고 싶습니다. 내 코드

Dictionary<string, Word> words = new Dictionary<string, Word>();
string text = webBrowser1.DocumentText;
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(text);
for (int i = 0; i < doc.DocumentNode.SelectNodes("//tr").Count; i++)
{
     HtmlNode node = doc.DocumentNode.SelectNodes("//tr")[i];
     Word word = null;
     if (TryParseWord(node, out word))
     {
          try
          {
               if (!words.ContainsKey(word.eng))
               {
                    words.Add(word.eng, word);
               }
          }
          catch
          { continue; }
     } 
}

그리고 파싱을위한 함수

private bool TryParseWord(HtmlNode node, out Word word)
{
    word = null;
    try
    {
        var eng = node.SelectNodes("//td")[1].InnerText;
        var trans = node.SelectNodes("//td")[2].InnerText;
        var rus = node.SelectNodes("//td")[3].InnerText;
        word = new Word();
        word.eng = eng;
        word.rus = rus;
        word.trans = trans;
        return true;

    }
    catch
    {
        word = null;
        return false;
    }
}

내 메서드 TryParseWord에서 나는 첫 번째 행에서만 가치가있다. 이 문제를 해결하는 방법?

수락 된 답변

이 방법으로 쉽게 값을 얻을 수 있습니다.

 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
 doc.LoadHtml(html);

 var table = doc.DocumentNode
            .Descendants("tr")
            .Select(n => n.Elements("td").Select(e => e.InnerText).ToArray());

사용법 :

foreach (var tr in table)
{
    Console.WriteLine("{0} {1} {2} {3}", tr[0], tr[1], tr[2], tr[3]);
}

인기 답변

XPath가 처음부터 다시 일치하지 않도록 변경해야합니다. 이렇게 :

node.SelectNodes(".//td")[1]

점은 XPath가 현재 노드에서만 일치하도록 지시합니다.



Related

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