2017년 4월 17일 월요일

c# 으로 웹 HTML 스크롤링[파싱] 할때 사용하는 라이브러리

웹 스크롤링을 파싱이라고 많이들 부른다.
정확한 단어는 스크롤링이라고 알고 있지만
보통 파싱이라는 단어를 많이 쓰고있다.
뭐 어째든 c# 으로 html 파싱을 할때 참 좋은 라이브러리가 있어
나중에도 사용하기 위해 포스트를 남겨 본다.

html 파일을 읽어 와서 파싱하는 방법은 아주 많이 있다.
그 중 내가 좀 할 줄 아는것은 php, 파이썬, c# 인데
파이썬도 편하지만 개발 툴 때문에 나는 c#을 주로 사용한다.

c# 으로 웹 html 파일을 읽어 올때
윈폼의 Webbroswer 컨트롤을 올려서 스크롤링 하는 방법이 있는데
이경우는 무조건 느리다.
나도 webbroswer 컨트롤로 스크롤링을 많이 하였지만
자바스크립트 에러 대처, 속도 이런 부가적인 문제 때문에
지금은 무조건 HttpWebRequest 를 사용해서 스크롤링 한다.

사설이 길었는데
HttpWebRequest 로 html 파일을 읽어와서 파싱할때 사용하는
아주 유용한 라이브러리중에 HtmlAgilityPack 라는것이 있다
NuGet 패키지 관리에서 HtmlAgilityPack 를 검색하고 설치하면 된다.
HtmlAgilityPack 라이브러리는 xPath 문법을 제공하는데
이 문법을 간략히 설명하자면 아래와 같다.

HtmlDocument doc = new HtmlDocument(); // 객체생성
doc.LoadHtml("html 문서내용");          // 돔 초기화

HtmlNode singleNode = doc.GetElementbyId("tagId"); // 태그의 ID=tagId 인것
//singleNode 노드의 자식중 a 태그들 *(.) 이 있어야 현재 노드부터 찾는다
HtmlNodeCollection anchors = singleNode.SelectNodes(".//a");
//singleNode 노드의 프로퍼티(클래스)값을 리턴한다.
string className = singleNode.GetAttributeValue("class", "");


// 메타태그중 name=keywords 인것
HtmlNodeCollection keyword = doc.DocumentNode.SelectNodes("//meta[@name='keywords']");

// div태그중 class=articles 인것
HtmlNodeCollection article = doc.DocumentNode.SelectNodes("//div[@class='articles']");

// 이렇게 경로로 특정 태그를 찾을수도 있음
HtmlNodeCollection anchors = doc.DocumentNode.SelectNodes("//table/tbody/tr/td/a");

// 특정 요소에서 자식요소들 Index 로 접근시
singleNode.SelectSingleNode(".//tbody/tr/td[1]").InnerText

위 문법만 사용하면 왼만한 태그는 다 찾아 올 수 있다.
중요한것은 특정 싱글 노드를 찾아서 그 자식요소들을 모두 리턴 받을때는
쩜(.)을 찍고 하위 노드를 입력해야 한다는 것이다.
좀더 자세히 알고 싶으면 xPath 문법을 검색 해 보면 알 수 있을것이다.

뭐 특정 웹 사이트를 읽어 와서 스크롤링(파싱)하는 코드를
추가 하고 싶지만 맨날 하는일이라 패스~~

댓글 없음:

댓글 쓰기