반응형
HtmlAgilityPack
꽤 많이 사용되고 있는 라이브러리입니다.
html string 을 load 하여 그 문자열을 파싱하는 방법입니다.
이것만으로 크롤링 할 수 없는 사이트가 많습니다. 왜냐하면 데이터를 async 하게 로드하는 경우는 사용할 수 없습니다.
(스크롤 다운 -> 로딩 같은)
그래서 Selenium 과 HtmlAgilityPack 을 같이 사용하면 유용한 경우가 있습니다.
Selenium 으로 많은 element 를 loop 돌며 처리할 때, 느린경우가 있습니다. (N 쇼핑 같은...)
이렇게 느린 부분을 HtmlAgilityPack 을 사용해서 파싱하여 처리합니다.
1. 설치
NugetPackage 관리자로 들어갑니다.
검색으로 HtmlAgilityPack 을 찾아서 설치합니다.
(혹시 안나올 경우 우측상단에 패키지 소스: [모두] 를 확인해주세요.)
2. 사용
using HtmlAgilityPack;
a. html string 이 있을 때,
String htmlString = ul.GetAttribute("outerHTML"); // selenium element 에서 html 가져옴
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlString);
b. url 로 가져올 때
String url = "https://hello-bryan.tistory.com/";
HtmlWeb web = new HtmlWeb();
HtmlDocument htmlDoc = web.Load(url);
c. node 사용 예제
- 자주 사용하는 속성.
- SelectSingleNode : 하나의 node 만 조회
- SelectNodes : 여러개의 node 조회
- GetAttributeValue : 해당 element 의 속성 조회
// span tag 중에 class 가 headline 인것
var spanHead = htmlDoc.DocumentNode.SelectSingleNode("span[@class='headline']");
// 전체 html 에서 a tag 중 "some_class_name" class 를 포함하는 첫번째 element
var div = htmlDoc.DocumentNode.SelectSingleNode("//div[contains(@class, 'some_class_name')]");
// 그 div 안에 table > tr > td > h3 > a 를 가져옴
var a = div.SelectSingleNode("table/tr/td/h3/a");
// a 의 href 속성을 가져옴. 두번째 파라메터는 속성이 없을 경우 기본값
Console.WriteLine(a.GetAttributeValue("href", ""));
// a 안에 있는 텍스트 가져오기
Console.WriteLine(a.InnerText);
// 여러개의 노드 조회
var prdtImgs = htmlDoc.DocumentNode.SelectNodes("//img");
foreach(var prdtImg in prdtImgs){
Console.WriteLine(prdtImg.GetAttributeValue("src", ""));
}
일단 여기까지...
나중에 더 많은 예제를 추가하는 걸로..
728x90
반응형
'C# 기술' 카테고리의 다른 글
[C#] ChromeDriver only supports characters in the bmp 해결하기 (0) | 2022.04.06 |
---|---|
[C#] Callback, Action으로 간단히 사용하기 (delegate 사용안함) (0) | 2021.11.25 |
[C#] 여러 개 Thread 사용 시 주의사항 (파라메터 사용 시) (0) | 2021.10.30 |
[C#] Tuple 사용하기 (0) | 2021.10.20 |
[Selenium] “Element Is Not Clickable at Point” 해결방법 (0) | 2021.08.29 |
댓글