[JAVA] jsoup 기초
-본 문서를 읽기 전 필요한 사전 지식 : html(css, jquery), java
JSOUP(제이솝)은 html, xml 등을 파싱하는 자바 라이브러리다. 원래 SOUP(솝)이라는 라이브러리인데, 자바에 맞게 다시 만들어졌으므로 J가 붙어 JSOUP이 되었다. 웹사이트의 내용을 쉽게 파싱(parse)해오고 싶을 때 사용한다. 크롤링(crawl)이라는 용어를 쓰기도 한다.
JSOUP 라이브러리는 mvnrepository에서 구할 수 있다. 2016년 5월 현재 가장 최신 버전은 1.9.2 버전이다.
참고로 메이븐(Maven)에서 쓰고 싶다면 아래 코드를 가져가면 된다.
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.9.2</version>
</dependency>
JSOUP 에서 html 문서 전체를 “도큐먼트”라고 한다. 이 도큐먼트 내부의 (1) 태그 사이의 텍스트, (2) 특정 태그의 어트리뷰트, (3)특정 태그를 포함한 소스 를 가져올 수 있게 해주는게 JSOUP 이다.
0. 임포트할 목록
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
1. 사이트 연결
Document doc = Jsoup.connect( targetUrl ).get();
//객체 Document 는 import org.jsoup.nodes.Document 를 임포트해서 쓴다.
System.out.println( doc ); 으로 찍어봐도 좋다. 찍으면 전체 사이트 내용이 출력된다.
2. 복수의 엘리먼트 파싱하기
//객체 Elements는 import org.jsoup.select.Elements; 를 임포트해서 쓴다.
위 코드는 “class가 box-contents인 div 태그의, class가 title인 strong 태그를 가져온다”는 뜻이다. 이런 설명은 한국말이 더 어렵다.
그냥 태그명을 쓰고 그 뒤에 쩜 클래스명을 주거나, 샵 클래스명을 주면 된다. (1) 클래스 가져오려면, 태그명.클래스명 을 주면 된다. (2) 아이디 가져오려면, 태그명#아이디명 이라고 쓰면 된다. 다시 말해 제이쿼리 셀렉션과 비슷하다.
이 때, 주의할 점은, 한 개가 아니라 해당 패턴에 일치하는 모든 태그를 긁어온다. (문서 내 모든 엘리먼트를 가져온다.)
예) 문서 내 모든 <div class=”a”>를 가져오려면, div.a 를 셀렉트
문서 내 모든 <div id=”b”>를 가져오려면, div#b 를 셀렉트
3. 단일 엘리먼트 파싱하기
Element oneTitle = titles.get( i );
System.out.println( oneTitle );
}
여기서 값을 가져오는 방식은 크게 3가지가 있다.
(1) text를 쓰면 태그 사이 글자만 가져온다.
(2) attr을 쓰면 태그 속의 속성(태그의 어트리뷰트)을 가져온다.
만약 그림(img태그)의 주소를 가져오고 싶다면 String strPoster = posterElement.attr(“src”); 식으로 가져오면 된다.
(3) html을 쓰면 태그까지 다 가져온다.
개인적으로 빅데이터 프로젝트를 했을 때는 JSOUP 을 쓰지 않고 자체적으로 개발해서 사용했었다. 주석을 제거하는 등 html태그만을 분석해내는 기술은 제법 까다롭다. 생각보다 많은 예외가 있기 때문에, JSOUP을 쓰는게 좋은 방법이다. 필자는 공부 목적으로 파서기를 코딩했었지만, 어떤 서비스를 구현하기 위해 파싱이 필요한 상황이라면 JSOUP을 추천한다.