재우니의 블로그

 

CsQuery 를 사용해 봅시다.

 

CsQuery is a complete CSS selector engine, HTML parser, and jQuery port for C# and .NET 4.

 

말그대로 CsQuery 은 css 의 select엔진 및 html 파서, jquery 특정 부분과 동일하게 사용할 수 있으며 .net 4 부터 지원이 됩니다.

 

https://github.com/jamietre/CsQuery/

 

예제를 살펴보면..

 

 

dom 값에 html 을 할당합니다.

 

CQ dom = "<div>Hello world! <b>I am feeling bold!</b> What about <b>you?</b></div>";

//b 태그의 값이 2개 있는데 이를 ToList() 하여 배열로 가져옵니다.
CQ bold = dom["b"];               /// find all "b" nodes (there are two in this example)

  > bold.ToList()
  > Count = 2
  > [0]: {<b>...</b>}
  > [1]: {<b>...</b>}


 

First 함수로 첫번째 b 태그에 접근해서, RenderSelection() 함수를 통해 값을 가져옵니다.
  > bold.First().RenderSelection()
  > "<b>I am feeling bold!</b>"


 

태그를 제거한 내부 글자값만 가져오기 위해서 jquery 와 동일한 함수인 Text 함수를 사용합니다.
string boldText = bold.Text();        /// jQuery text method;

  > boldText
  > "I am feeling bold! you?"


 

jquery 와 동일한 dom 제거 함수인 Remove() 를 활용합니다.
bold.Remove();                        /// jQuery Remove method


 

최종 dom 값을 출력하기 위해서 Render 함수를 사용합니다.
string html = dom.Render();          

  > html
  > "<div>Hello world!  What about </div>"

 

특정 dom 에 첫번째 글자값을 가져오기 위해서 css 선택방법과 동일한 기술을 구현합니다.

string bold = dom["div > b:first-child"].Text();


 

css의 필터 함수와 동일한 방법으로도 가져올 수 있습니다.

string bold = dom["b:first"].Text();

 

c# 의 linq 구문으로 가져올수도 있습니다.

string bold = dom["b"].First().InnerText;

 

Select 라는 인덱서를 통해 가져올 수 있습니다.

string bold = dom.Select("b")[0].InnerText;

 

jQuery 의 Contents 함수와 동일한 코드로도 가져올 수 있습니다.

string bold = dom["b"].Contents()[0].NodeValue

 

위의 코드는 전부 "I am feeling bold" 라는  값을 출력하게 됩니다.

 

npm에는 아래와 같습니다. 실행하면 CsQuery.dll 이 bin 폴더에 추가됩니다.

 

PM> Install-Package CsQuery

 

참고로 CsQuery 는 https://github.com/jamietre/HtmlParserSharp 의 HtmlParserSharp 를 이용한 라이브러리 입니다.

따라서 설치 시 해당 HtmlParserSharp 도 포함됩니다.

 

html 값을 넣는 방법

var dom = CQ.Create(html);  

사이트의 html 로 가져오는 방법

var dom = CQ.CreateFromUrl("http://www.jquery.com");

자세한 것은 해당 https://github.com/jamietre/CsQuery/ 사이트를 참고하시기 바랍니다.

 

 

이를 응용한 블로그를 추천 해 드립니다.

 

 

 

 

private void button1_Click(object sender, EventArgs e){

    CQ.CreateFromUrlAsync("http://ip-science.thomsonreuters.com/cgi-bin/jrnlst/jlresults.cgi?PC=D&Full=" + textBox1.Text, successDelegate);

}

 

void successDelegate(ICsqWebResponse response){

    var dom = response.Dom;

    var found = dom["#mainFull form ul"][0].Cq();

    String title = found.Find("h4")[0].InnerText;

    var ISBN = found.Find(".coverage")[0]["href"].Split('\'')[1];

    var cover = found.Find("div li a");

 

    String text="";

    for (int i = 0; i < cover.Length - 1; ++i){

        var li = cover[i];

        text += li.InnerText + "\r\n";

    }

 

    this.Invoke((MethodInvoker)delegate{

        textBox2.Text = ISBN + "\r\n" +text; // runs on UI thread

    });

}