[C#] NSoup 라이브러리 (XML, HTML 파서)


Development note/C#  2019. 6. 6. 23:15

안녕하세요. 명월입니다.


이 글은 C#에서 Xml이나 Html를 파서해서 Jquery의 CssSelector 엔진(Sizzle)처럼 요소를 검색, 수정이 가능하게끔 하는 Nsoup 라이브러리의 대한 소개입니다.

사실 Nsoup는 Java Jsoup와 Python의 beautifulsoup와 비슷한 동작을 합니다.


개인적으로 Html이나 Xml 데이터 읽어 들이는데에는 Nsoup만큼 편한건 없다고 생각합니다. HtmlAgilityPack라이브러리를 통해 Xpath로 읽어 사용하는 방법도 있습니다만, 현재는 CssSelector 방법이 꽤 익숙해져서 Nsoup가 더 편하지 않을 까 싶습니다.


먼저 Visual studio에서 Nuget을 이용해 Nsoup 라이브러리를 연결합니다.

using System.IO;
using NSoup;
using NSoup.Nodes;
using System.Net;

class Program
{
  //HttpWebRequest를 사용해서 인터넷 상의 페이지를 가져온다.
  public static string GetRequest(String url)
  {
    try
    {
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
      request.Method = "GET";
      request.ContentType = "application/x-www-form-urlencoded";
      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
      {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
          return reader.ReadToEnd();
        }
      }
    }
    catch (Exception e)
    {
      throw e;
    }
  }

  static void Main(string[] args)
  {
    // HttpWebRequest로 가져온 Html String 객체
    var html = GetRequest("http://nowonbun.tistory.com/rss");
    // NSoup 라이브러리로 Document 객체로 파서한다.
    Document doc = NSoupClient.Parse(html);
    // 태그 명이 item인 것을 찾는다.
    var element = doc.Select("item");
    foreach(var ele in element)
    {
      // item title의 객체를 찾는다.
      Console.WriteLine(ele.Select("title").Text);
    }
    
    // 위와 같은 형식이나 css를 이용해서 검색 형태를 바꾸었다.
    element = doc.Select("item > description");
    foreach (var ele in element)
    {
      // description을 Hello world로 수정
      ele.Text("Hello world");
    }
    
    // 수정된 것이 제대로 출력 되나 확인
    Console.WriteLine(doc.ToString());

    Console.WriteLine("Press any key...");
    Console.ReadKey();
  }
}

위 결과 이미지 보면 link의 경우는 버그가 발생하네요.. 그러나 xml을 xpath가 아닌 Jquery처럼 조금 손쉽게 정보를 얻을 수 있네요.


이걸로 xml로 데이터를 주고 받는 경우가 있으면 좀 더 편하게 데이터를 파싱하고 분석해서 만들 수 있지 않을까 싶습니다.


여기까지 Nsoup 라이브러리에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.