본문 바로가기

개발이야기/Library

유용한 Java 기반 Html Parsing Library : jsoup

jsoup

jsoup는 Java HTML Parser이다. HTML parser로서 아주 편리하며 강력한 기능들을 가지고 있다. 어떤 html dom객체에 접근한다고 가정한다면 마치 jqeury를 쓰듯이 간단하게 접근가능하다. 자세한 예제는 아래에서 보이고자 한다.
사이트 url : https://jsoup.org/

Example

1
2
Document doc = Jsoup.connect("http://en.wikipedia.org/").get();
Elements newsHeadlines = doc.select("#mp-itn b a");
cs


위와 같이 Jsoup객체에 connect를 사용하여 컨넥션을 맺고, get()을 통해 html Document 전체를 파싱한다. 그리고 doc.select(); method를 사용하여 dom객체를 찾아 수집하여 Element 변수에 저장한다.


Getting started with Gradle

gradle을 사용하여 Java html parsing 프로그램을 만들고자 한다.

  • 준비물
    • Intellij Community or Ultimate 
    • Gradle
    • Only 1minutes


1. gradle.setting

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
group 'parse'
version '1.0-SNAPSHOT'
 
apply plugin: 'java'
 
sourceCompatibility = 1.5
 
repositories {
    mavenCentral()
}
 
dependencies {
    compile 'org.jsoup:jsoup:1.10.3'
}
 
cs


mavenCentral에 이미 jsoup가 버젼별로 준비되어 있기때문에 상기와 같이 디펜던시를 걸어준다. 


2. Main.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.parse.apat;
 
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
 
public class Main {
    public static void main(String[] args) throws Exception {
        Document doc = Jsoup.connect("http://land.naver.com/article/articleList.nhn?cortarNo=4113511400").get();
        Elements apartName = doc.select("a.sale_title");
        Elements stories = doc.select("td.num2 div.inner span");
 
        for (int i = 0; i < apartName.size(); i++) {
            System.out.println("층수 :" + stories.get(i).html() + " \t| 아파트이름 : " + apartName.get(i).html());
        }
 
 
    }
}
 
cs


상기 코드는 네이버 부동산페이지에서 아파트의 이름과 해당 단지의 층수를 가져오고자 하였다.


네이버 부동산페이지(http://land.naver.com/article/articleList.nhn?cortarNo=4113511400)

※ cortarNo는 행정구역상 법정동의 코드이다. 만약 부동산페이지의 각 동에 대해 크롤링 하여 파싱하고 싶다면 행정안전부에서 제공하는 법정동코드를 상기 url중 뒤쪽 숫자코드에 넣으면 적용된다.

(법정동코드 조회 홈페이지 바로가기(클릭))


Html parsing을 하려면 해당 페이지의 dom 구조를 알아야 한다. 해당 페이지의 dom 구조를 알기 위해 우클릭, 소스보기를 눌러 아래와 같은 규칙이 있다는 점을 찾았다.


부동산페이지.html 중 일부 발쵀

1
2
3
4
5
6
7
    <td colspan="2" class="align_l name">
        <div class="inner">
            <span class="ico_owner1">집주인</span>
            <a href="#" class="NPI=a:list,r:1,i:1710588857 sale_title" onclick="nhn.article.common.moveArticleDetail('1710588857','A01','A01','B1');return false;" title="화이트빌">화이트빌</a>
            <a href="/article/articleDetailInfo.nhn?atclNo=1710588857&atclRletTypeCd=A01&rletTypeCd=A01&tradeTypeCd=B1" class="NPI=a:listnew,r:1,i:1710588857 btn_newpage" target="_blank"><img src="http://static.land.naver.net/static/service/20170731/article/blank.gif" style="background:url(http://static.land.naver.net/static/service/20170731/article/articlelist.gif) -110px -90px no-repeat;" width="11" height="11" alt="새창열기"></a>
        </div>
    </td>
cs


a tag안에 sale_title이라는 class를 가진 dom의 내부에 아파트 이름을 찾았고, jsoup에서 해당 dom객체를 찾는 코드를 아래와 같이 작성했다.


1
Elements apartName = doc.select("a.sale_title");
cs


층수도 마찬가지로 관련된 dom tag를 찾아 적용하였다.


결과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
층수 :2/3     | 아파트이름 : 화이트빌
층수 :7/20     | 아파트이름 : 무지개마을3단지신한,건영
층수 :15/15     | 아파트이름 : 무지개2단지LG
층수 :8/17     | 아파트이름 : 무지개1단지대림
층수 :5/17     | 아파트이름 : 무지개1단지대림
...
(생략)
...
층수 :4/4     | 아파트이름 : 까치건영빌라
층수 :6/11     | 아파트이름 : 까치롯데,선경
층수 :9/10     | 아파트이름 : 까치주공2단지
층수 :15/15     | 아파트이름 : 무지개1단지대림
층수 :9/9     | 아파트이름 : 까치대우,롯데,선경
 
Process finished with exit code 0
 
cs


아주 성공적으로 html parsing이 되었다!


총평

jsoup는 아주 강력하고 간편한 library이다. 하지만 html parser라는 단점도 존재한다. 바로 html이 변경되면 해당 코드는 무용지물이 된다는 점이다. 이점을 잘 기억하고 html parser에 맞는 프로그램을 적절히 작성한다면 강력한 프로그램이 될 것이다.


End of Document







반응형