본문 바로가기

공부

android html 파싱, jericho

안드로이드에서 html 문서 파싱을 하기 위해 검색을 해보았다. 


RSS를 지원하는 사이트의 파싱은 Xmlpullparser를 이용하는 것이 가장 효율적이라고 한다.

RSS를 지원하지 않는 사이트의 파싱은 DOM이나 Jericho를 사용할 수 있다.


===========================================================================================

첫번째 걸린 블로그이다.  http://blog-kr.specialguy.net/130


자바 html 파서 jericho의 안드로이드용이 다음 주소에 있다.

 jericho-android.jar 를 다운로드 하여 임포트 하여 쓰면 된다고 한다.

http://blog.naver.com/zeanz?Redirect=Log&logNo=110092582999


===========================================================================================


이클립스에서 jericho.jar를 임포트 하는 방법이다. 

출처는 http://dodo4989.tistory.com/106


먼저 Project에 라이브러리를 import시킨다.

즉, Project -> import -> General -> File System -> jar파일등록하면 

Project에 해당 Library가 추가된다.

 

다음으로는 해당 Library를 Project에서 사용할 수 있도록 설정을 해주어야 한다.

Project선택 후

Properties(Alt + Enter) -> Java Build Path -> Libraries Tab -> Add JARs -> JAR파일 선택

 


또는 import 시키지 않고 외부에서 Library를 가져올 수 도 있다.

 

Project선택 후

Properties(Alt + Enter) -> Java Build Path -> Libraries Tab -> Add External JARs -> JAR파일 선택

 

 

 

*. 추가 확인 사항

Jericho HTML Parser를 설치한 후에 java 소스 상에서 아래와 같이 사용할 경우.

Source source = null;

source = new Source(new URL(sourceUrlString));

Source Import시 두가지 중 import net.htmlparser.jericho.Source; 를 설정해 주어야 한다


===========================================================================================

사용 예제 하나 

http://blog.naver.com/mysk4521?Redirect=Log&logNo=40093081572


===========================================================================================

다른 블로그의 포스트 내용 중 일부다. http://blog.naver.com/freemagick/100138927843

1. jericho 파서를 다운받아 넷빈즈 프로젝트폴더의 libs안에 넣어준다.

2. manifest에서 

<uses-permission android:name="android.permission.INTERNET" /> 를 넣어준다. </application>다음에 넣어주도록한다.(이걸 안해주면 실행시 source객체를 이용할때 에러가뜨며 종료됨)


===========================================================================================

또 다른 사용 예를 살펴본다. 코드 출처는 http://ckritbuddy.tistory.com/42


이 예제는 주어진 url의 html을 읽어온 후 구문분석을 하고 그 중에서 text만 추출하여

텍스트뷰에 출력하는 작업을 수행한다.


// Jericho.java

package aa.bb.zz.Jericho;


import java.net.URL;

import net.htmlparser.jericho.Source;


import android.app.Activity;

import android.os.Bubdle;

import android.widget.TextView;


public class Jericho extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);


String yourUrl = "http://code.google.com/intl/ko/android/";


TextView tv = (TextView)findViewById(R.id.mainTextView);

tv.setText(getHtmltoText(yourUrl));

}


public String getHtmltoText(String sourceUrlString) {

Source source = null;

String content = null;


try {

//url에서 html 소스를 읽어온다.

source=new Source(new URL(sourceUrlString));

// 한글사용을 위해서는 윗 줄의 코드를 아래처럼 수정

// URL sUrl = new URL(sourceUrlString);

// InputStream is = sUrl.openStream();

// Source source= new Source(new InputStreamReader(is,"euc-kr"));

// "euc-kr" 부분은 charset에 맞춰 변경해준다. UTF-8, KSC5601 etc...


// 전체 소스 구문을 분석한다.

source.fullSequentialParse();

// HTML markup에서 text contents만 가져와서 스트링으로 변환한다.

content=source.getTextExtractor().toString();

} catch (Exception e) {

e.printStackTrace();

}

return content;

}

}



===========================================================================================

사용 예 하나더 , 택배조회 하는 예제 // 코드 출처는 http://webfine.tistory.com/4

CJ 택배 운송장 조회사이트를 파싱하여 배송현황만 추출하고 콘솔에 결과를 출력하는 소스이다.

사이트 모양은 위 링크 참조


List를 사용하는 부분들은 자료값을 가지고 와서 콘솔창에 찍어주기 위해 적은 부분으로, 마지막을 DB부분에 넣거나 View 페이지로 자료 값을 넘겨주어서 노출 시킬 수도 있습니다.

여기서 가장 중요한 부분은 getAllElements(HTMLElementName.태그이름.get(순서) 부분으로 실질적으로 해당 태그안의 값을 가져오는 부분입니다. 해당이름으로 된 태그의 자식태그들을 모두 가져 오는 것이 getAllElements() 메소드입니다.

해당 페이지를 소스 보기 하신 후 자식태그를 제외한 부모태그들만 순서를 계산하여서 가지고 오는 것이지요. 순서는 0번 부터 입니다.

그 데이터를 가져 온 부분에서 계속 하위로 검색을 하다보면 마지막에 자신이 원하는 값을 가진 HTML 부분은 파싱할 수 있을 것입니다.

단점은 해당 페이지의 디자인이 변경된다면 다시 소스를 작업해야 한다는 것이지만, 실제 DB에 접속이 불가능하지만 웹사이트에서 노출 되는 부분들이 있다면 이 방식으로 데이터를 가져올 수 있습니다.


import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.HTMLElementName;
import net.htmlparser.jericho.Source;
 
public class HtmlTableTagParse {
    public static void main(String[] args) 
throws MalformedURLException, IOException {

        //송장 번호를 받는다.
        String num = "602411606750";
         
        //송장 번호와 cj택배에 배송추적 관련 주소와 연결 시킨다.
String url ="http://www.cjgls.co.kr/kor/delivery/service/

         
        //해당 URL 페이지를 가져온다.
        Source source = new Source(new URL(url));
         
        //메소드 찾기를 위해 시작부터 끝까지 태그들만 parse 한다 (?)
        source.fullSequentialParse();
         
        //해당 데이터가 있는 부분을 찾는 부분.
        Element div = source.getAllElements(HTMLElementName.DIV).get(2);
         
        Element table = div.getAllElements(HTMLElementName.TABLE).get(1);
         
        List trList = table.getAllElements(HTMLElementName.TR);
         
        Iterator trIter = trList.iterator();
         
        trIter.next();
         
        while(trIter.hasNext()){
            Element tr = (Element) trIter.next();
 
            List dataList = tr.getAllElements(HTMLElementName.TD);
             
            Iterator dataIter = dataList.iterator();
             
            int chk = 0;
             
            List resultList = new ArrayList();
             
            //원하는 결과 값이 들어가는 부분.
            List rowList = new ArrayList();
             
            while(dataIter.hasNext()){
                Element data = (Element) dataIter.next();
                String value = 
data.getContent().getTextExtractor().toString();
                rowList.add(chk,value);
                 
                chk++;
                 
                if(chk == 5){
                    resultList.add(rowList);
                    chk = 0;
                }
            }
             
            //콘솔 창에서 확인 하기 위한 부분.
            Iterator resultIter = resultList.iterator();
             
            while(resultIter.hasNext()){
                List list = (ArrayList)resultIter.next();
                 
                System.out.println((String)list.get(0) + list.get(1) +
                                list.get(2) + list.get(3) + list.get(4));
            }
        }
         
    }
}


출처 :
http://blog.naver.com/PostView.nhn?blogId=hojoon108&logNo=80141722664  
728x90