HTMLAgilityPack은 모든 텍스트 노드만을 반복합니다.

html-agility-pack

문제

다음은 HTML 스 니펫입니다. 원하는 것은 텍스트 노드 만 가져 와서 반복하는 것입니다. Pls 알려주세요. 감사.

<div>
   <div>
      Select your Age:
      <select>
          <option>0 to 10</option>
          <option>20 and above</option>
      </select>
   </div>
   <div>
       Help/Hints:
       <ul>
          <li>This is required field.
          <li>Make sure select the right age.
       </ul>
      <a href="#">Learn More</a>
   </div>
</div>

결과:

  1. 나이 선택 :
  2. 0 ~ 10
  3. 20 이상
  4. 도움말 / 힌트 :
  5. 이것은 필수 입력란입니다.
  6. 적절한 연령을 선택하십시오.
  7. 더 알아보기

수락 된 답변

이 같은:

    HtmlDocument doc = new HtmlDocument();
    doc.Load(yourHtmlFile);

    foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[normalize-space(.) != '']"))
    {
        Console.WriteLine(node.InnerText.Trim());
    }

출력 내용 :

Select your Age:
0 to 10
20 and above
Help/Hints:
This is required field.
Make sure select the right age.
Learn More

인기 답변

나는 Google 홈 페이지에서 @Simon Mourier의 대답을 테스트했으며 CSS와 Javascript가 많았으므로 추가 필터를 추가하여 제거했습니다.

    public string getBodyText(string html)
    {
        string str = "";

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

        try
        {
            // Remove script & style nodes
            doc.DocumentNode.Descendants().Where( n => n.Name == "script" || n.Name == "style" ).ToList().ForEach(n => n.Remove());

            // Simon Mourier's Answer
            foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[normalize-space(.) != '']"))
            {
                str += node.InnerText.Trim() + " ";
            }
        }
        catch (Exception)
        {
        }

        return str;
    }



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