안녕하세요. 요새 너무 바빠서 글을 올릴 시간이 없었네요.


이번에는 jericho-android.3.1.jar 를 이용해서 유튜브 홈페이지의 재생목록을 파싱해보도록 하겠습니다.


jericho-android.3.1.jar 파일은 첨부파일에 올려놓을테니 다운받으시고 이클립스에서 Build Path에 추가해주세요.(추가하시는 방법 모르시면 댓글 달아주세요.)

jericho-android.3.1.jar



그럼 시작하겠습니다.


우선 제가 파싱하고자 하는곳을 살펴보도록 하겠습니다.


제가 만들어 놓은 재생목록 입니다. 물론 다른 사람의 재생목록도 볼 수 있습니다.




제가 올린 재생목록이 보이는데 이중에서 구름빵 2기에 들어가 보겠습니다.


구름빵 2기 들어가면 다음과 같습니다.





제목과 올린사람 ID 시간등이 보이네요.


여기를 파싱해 보도록 하겠습니다.


유튜브는 파싱을 할려면 다음 주소에 들어가야합니다.


https://gdata.youtube.com/feeds/api/users/kcizzang/playlists


위에 빨간배경 글자는 제 아이디 입니다. 저 부분만 본인 아이디 또는 다른사람 아이디를 입력하시면 됩니다. 우선 제 아이디로 들어갔을때 화면을 보도록 하겠습니다.




위 사진처럼 xml 문서가 보이게 되는데 아까 제가 구름빵 2기를 파싱한다고 했으므로 빨간 상자의 주소에 들어가도록 합니다.


주소는 다음과 같습니다 : https://gdata.youtube.com/feeds/api/playlists/PLjMAs0z8gAZjibk9-Ag9NIOOdPA03D5j-


비슷한 URL 들이 보이는데 https://gdata.youtube.com/feeds/api/playlists/재생목록리스트 <- 이러한 형식의 URL로 접속하셔야 정확한 정보가 보이게 됩니다.




정확하게 들어오셨다면 위 그림과 같은 화면이 나오게 됩니다. 여기에서 우선 저는 제목만 파싱만 해올것이라서 위에 줄친것을 보도록 합니다.


<title type="text">구름빵 2기 26화 홍시의 습관 고치기


이렇게 되어있네요. 위에 title, type, text 를 잊지말고 이제 코딩을 시작하겠습니다.



import java.net.URL;

import java.util.ArrayList;

import java.util.List;


import net.htmlparser.jericho.Element;

import net.htmlparser.jericho.HTMLElementName;

import net.htmlparser.jericho.Source;

import net.htmlparser.jericho.TextExtractor;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;


public class MainActivity extends Activity{


TextView textView;  // 제목을 표시해줄 텍스트뷰

private static Thread thread = null;

String parsing_url;  // 파싱해오고자 하는 URL

String get_data;  // 파싱해서 가져온 데이터를 저장할 스트링 변수

ArrayList<String> array;  // get_data 변수의 값을 순차적으로 저장할 배열

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        

        textView = (TextView)findViewById(R.id.textView1);

parsing_url = "https://gdata.youtube.com/feeds/api/playlists/PLjMAs0z8gAZjibk9-Ag9NIOOdPA03D5j-";

Runnable task = new Runnable(){

public void run(){

getData(parsing_url);

}

};

thread = new Thread(task);

thread.start();  // 반드시 쓰레드를 해줘야함 그 이유는 아래에서 설명

try{

thread.join();  // 쓰레드 작업 끝날때까지 다른 작업들은 대기

}catch(Exception e){

}

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

textView.append(array.get(i) + "\n");  // 쓰레드 작업 끝나면 텍스트뷰에 가져온 데이터를 입력

}

}

    

    // 파싱 작업을 하는 메서드

    public ArrayList<String> getData(String strURL){

    Source source;

    get_data = "";

    array = new ArrayList();

    try{

    URL url = new URL(strURL);

    source = new Source(url);  // 쓰레드를 사용 안하면 여기에서 예외 발생함 그 이유는 아래에서 설명

    Element element = null;

   

    List<Element> list = source.getAllElements(HTMLElementName.TITLE); // title 태그의 엘리먼트 가져옴

   

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

    element = list.get(i);

    String attributevalue = element.getAttributeValue("type");  // title 태그의 속성값이 type을 찾는다

    if(attributevalue != null){

    if(attributevalue.equalsIgnoreCase("text")){  // type의 값이 text 이면

    TextExtractor textExtractor = element.getTextExtractor();  // 해당 문자값을 가져온다

    get_data = textExtractor.toString();  // 가져온 값을 스트링으로 변환후

    array.add(get_data);  // ArrayList에 추가한다

    }

    }

    }

    }catch(Exception e){

   

    }

    return array;  // 입력된 배열값을 리턴

    }

}

 


끝입니다. 안드로이드 공부한지 얼마안되어서 그런지 소스 정리를 잘 못하겠네요. 이해해주시구요. ㅎㅎ


그럼 실행화면을 한번 볼까요?




예~ 성공적으로 잘 가져오네요.


우선 아까 위에 주석에 보면 쓰레드를 반드시 이용해야한다고 했는데 그 이유는 예전에 안드로이드 진저브레드(2.3버전) 까지는 네트워크 작업을 메인 쓰레드에서 같이 작업이 가능했었습니다.


하지만 아이스크림(4.0버전) 이후부터는 네트워크 작업에 메인쓰레드에서 작업이 안되도록 했습니다.


그래서 반드시 쓰레드를 생성해야 한다는 것입니다.


별거 아닌 이유를 왜 지금 적느냐면 다른데서 구글링 해보면 거의 대부분이 쓰레드를 이용하라는 언급이 없어서 이렇게 저라도 글을 남기고 있습니다.


쓰레드는 여기까지 하고...다음은 처음 그림에서 title, type, text를 유심히 보라고 했었는데 소스 적어놓은데 보면 그 이유가 있습니다. 뭐...어렵지 않으니까 보시면 아~ 하실꺼에요.


혹시 이해안되시거나 궁금한거 있으시면 댓글 달아주시면 성실히 답변 드리도록 하겠습니다. ㅎ



Posted by 정윤문경아빠