[JAVA] jsoup 기초

[JAVA] jsoup 기초

 

-본 문서를 읽기 전 필요한 사전 지식 : html(css, jquery), java

JSOUP(제이솝)은 html, xml 등을 파싱하는 자바 라이브러리다. 원래 SOUP(솝)이라는 라이브러리인데, 자바에 맞게 다시 만들어졌으므로 J가 붙어 JSOUP이 되었다. 웹사이트의 내용을 쉽게 파싱(parse)해오고 싶을 때 사용한다. 크롤링(crawl)이라는 용어를 쓰기도 한다.

JSOUP 라이브러리는 mvnrepository에서 구할 수 있다. 2016년 5월 현재 가장 최신 버전은 1.9.2 버전이다.

참고로 메이븐(Maven)에서 쓰고 싶다면 아래 코드를 가져가면 된다.
 

<!– http://mvnrepository.com/artifact/org.jsoup/jsoup –>

<dependency>

    <groupId>org.jsoup</groupId>

    <artifactId>jsoup</artifactId>

    <version>1.9.2</version>

</dependency>

JSOUP 에서 html 문서 전체를 “도큐먼트”라고 한다. 이 도큐먼트 내부의 (1) 태그 사이의 텍스트, (2) 특정 태그의 어트리뷰트, (3)특정 태그를 포함한 소스 를 가져올 수 있게 해주는게 JSOUP 이다.

0. 임포트할 목록 

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

1. 사이트 연결 

String targetUrl = http://naver.com/;

Document doc = Jsoup.connect( targetUrl ).get();

//객체 Document 는 import org.jsoup.nodes.Document 를 임포트해서 쓴다.

System.out.println( doc ); 으로 찍어봐도 좋다. 찍으면 전체 사이트 내용이 출력된다.

2. 복수의 엘리먼트 파싱하기 

Elements titles = doc.select( “div.box-contents strong.title” );

//객체 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. 단일 엘리먼트 파싱하기 

for( int i=0; i<titles.size(); i++ ){

    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을 추천한다.