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
});
}