[Android SDK] [Android] Jsoup 으로 파싱하기 

 

 

Jsoup

파이썬의 BeautifulSoup , C#의 HtmlAgilityPack 와 같이

JAVA의 HTML 파싱을 할 수 있는 라이브러리 Jsoup이다.

권한, gradle

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
 
 
implementation 'org.jsoup:jsoup:1.11.3'

퍼미션은 당연히 인터넷을 사용하기 때문에 필요하다.

사용법

네이버 영화 웹에서 데이터를 파싱 해볼 것이다.

Document doc = Jsoup.connect("https://movie.naver.com/movie/running/current.nhn").get();

connect()를 이용하여 원하는 웹 사이트 주소의 내용을 가지고 올 수 있다.

그 후 필요한 태그의 정보를 가지고 올 때는 select()를 이용하여 가지고 오게 되는데

영화의 정보들이 모두 <li> 태그 안에 있으니 li 태그의 내용을 모두 가지고 와야 한다.

Document doc = Jsoup.connect("https://movie.naver.com/movie/running/current.nhn").get(); Elements mElementDatas = doc.select("ul[class=lst_detail_t1]").select("li"); //1 Elements mElementDatas = doc.select("ul[class=lst_detail_t1] li"); //2 Elements mElementDatas = doc.select(".lst_detail_t1").select("li"); //3 Elements mElementDatas = doc.select(".lst_detail_t1 li"); //4

1번, 2번, 3번, 4번 모두 사용해도 되며 각각 같은 동작 방식을 가지고 있다.

1번은 ul 태그의 class 이름이 "lst_detail_t1"에서 다시 li 태그만을 가지고 오는 모습이고

2번은 ul 태그의 class 이름이 "lst_detail_t1"이며 이 안의 li 태그를 가지고 오는 모습이다.

즉 차이는 두 번 검색하는 것과 한번 검색하는 차이이다.

3번은 "lst_detail_t1"앞에. 을 더해주는 것으로 class 이름을 찾을 수 있는데 의미상으로는

class ="lst_detail_t1"를 ."st_detail_t1로 표기한 모습이다.

1번과 2번은 태그의 class 이름을 검색하였다면 3번과 4번은 전체 태그 중 class 이름을 찾은 것이다.

class 이름은 앞의. 을 붙이고

id 명은 앞에 # 을 붙인다.

영화 제목 가지고 오기 select()

이제 각 영화의 제목을 가지고 오려 한다.

영화의 제목은

<dt class="tit">의 a 태그에 있는 모습을 볼 수 있다.

Document doc = Jsoup.connect("https://movie.naver.com/movie/running/current.nhn").get(); Elements mElementDatas = doc.select(".lst_detail_t1").select("li"); for(Element elem : mElementDatas){ String my_title = elem.select("dt[class=tit] a").text(); }

for 문은 처음에 얻었던 모든 영화 <li> 태그를 전부 회전하기 위함이다.

dt 태그의 class 이름이 tit인 곳의 a 태그의 text를 가지고 오는 모습이다.

text() 와 toString()의 차이는

toString로 하면 모든 결괏값을 보여주지만

text() 를 하면 태그와 태그 사이에 있는 text만 출력한다.

이 또한 위처럼

String my_title = elem.select(".tit a").text();

이렇게 class를 생략해서 작성할 수 있다.

영화 링크 가지고 오기 attr()

영화 제목에 맞는 각 링크를 가지고 오려 한다.

링크의 위치를 확인해보지 div class ="thumb" 태그 안에

a 태그로 href에 위치하는 것을 볼 수 있다.

위에서는 a 태그의 text를 가지고 왔다면 여기서는 a 태그 안의 속성(href)의 정보를 가지고 와야 한다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

attr은 태그의 속성정보를 가지고 올 수 있다.

String my_link = elem.select("div[class=thumb] a").attr("href");

div 태그의 class 이름은 thumb이고 그 안의 a 태그의 href 내용을 가지고 온다.

영화 이미지 url 가지고 오기 attr()

clss 이름은 thumb이고 이안의 a 태그 안의 img 태그 안의 src 내용을 가지고 와야 한다.

String my_imgUrl = elem.select("div[class=thumb] a img").attr("src");

이 또한 위와 같이 attr() 을 이용하여 img 태그의 src 내용을 가지고 오는 모습이다.

영화 개요 가지고 오기 first()

영화의 개요를 가지고 오려고 보니

dt class="tit_t1" 태그 안의 <dd> 태그에 영화 개요가 위치하고 있다.

String my_link = elem.select(".tit_t1 dd");

이렇게 하려 하였지만

tit_t1이라는 class 이름이 위에서도 쓰이고 있어서 원하는 위치로 나오지 않고 다른 결괏값이 나오게 된다.

그래서 더위에 있는 태그인

<dl class=info_txt1"> 에서부터 내려야 하는데

Element rElem = elem.select("dl[class=info_txt1] dd").first();

이렇게 가지고 올 수 있다. dl 태그 class 이름 "info_txt1" 안의 dd 태그로 접근하는데

그중 first() 첫 번째 dd 태그로 접근한다.

.first()를 사용하는 이유는 dd 태그가 여러 개가 나오게 될 경우 어디로 접근하게 될지 모르기 때문에

첫 번째로 접근하라고 알려주는 것이다.

그다음 태그로 접근하고 싶다면 next() 태그를 사용할 수 있다.

영화감독 정보 가지고 오기 next() , first()

영화감독 정보는 class = tit_t2에 위치하고 있다.

여기서는 위와 다르게 중복된 className 가 아니기 때문에 바로 접근할 수 있다.

그렇게 dt class ="tit_t2" 태그에서 다음 태그인 <dd> 태그로 넘어가기 위해

next()를 사용하여 넘어가 주면 된다.

Element dElem = elem.select("dt[class=tit_t2]").next().first(); String my_director = dElem.select("a").text();

아니면 위에 개요 정보를 얻은

info_txt1 에서부터

Element dElem = elem.select("dl[class=info_txt1] dd").next().next().first();

next()를 여러 번 하여 원하는 태그로 이동해도 된다.

Jsoup 에러

위와 같이 connet부터 에러가 나는 경우

import를 확인해봐야 한다.

import org.w3c.dom.Document;

위와 같이 되어있으면 에러가 발생하니

import org.jsoup.nodes.Document;

로 변경해주자.

또 Jsoup를 동작할 때는 AsyncTask를 이용할 것.

 

[출처] https://m.blog.naver.com/PostView.naver?blogId=vps32&logNo=221818554156&proxyReferer=&noTrackingCode=true

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
153 [Android Studio] Google Play Console - 앱 API 수준 업데이트하기 (앱 업데이트 출시, 앱 API 수준 이상 타겟팅 방법, API 31 To 33) file 졸리운_곰 2024.08.28 203
152 [android studio] 안드로이드 앱 배포, APK와 AAB file 졸리운_곰 2024.05.03 208
151 [Android SDK] [안드로이드] 접속된 네트워크 인터페이스의 IP 주소 가져오기 졸리운_곰 2024.05.02 191
150 [Android SDK] [안드로이드] 핸드폰 번호, 기기 고유 id 등 단말기 정보 가져오기 file 졸리운_곰 2024.05.02 451
149 [Android SDK] Android) 안드로이드 Jsoup로 웹크롤링 하기 (예제포함) - "데일리 브리핑 앱 개발기" file 졸리운_곰 2024.05.01 138
148 [Android SDK] [Android] Activity 생명주기와 이동 file 졸리운_곰 2024.05.01 182
147 [Android SDK] [Android] EditText 읽기 전용으로 만들기 졸리운_곰 2024.05.01 120
146 [Android SDK] 안드로이드: 간단한 데이터를 저장하고 싶을 때(SharedPreferences 사용예제) 졸리운_곰 2024.05.01 145
» [Android SDK] [Android] Jsoup 으로 파싱하기 file 졸리운_곰 2024.05.01 146
144 [Android SDK] [Android] 안드로이드 - 액티비티(Activity)로부터 결과 데이터 받아오기 file 졸리운_곰 2024.05.01 166
143 [Android SDK] [안드로이드/Android] 기기 네트워크 연결 상태 확인 file 졸리운_곰 2024.05.01 138
142 [Android SDK] 안드로이드 - 메시징 - Toast 졸리운_곰 2024.05.01 201
141 [Android SDK] [Android] 안드로이드 Alert 창 띄우기 file 졸리운_곰 2024.05.01 170
140 [Android SDK] 버튼을 클릭하면, 동작하는 코드를 작성하는 방법 졸리운_곰 2024.05.01 120
139 [Android SDK] [ Android ] a webview method was called on thread 'javabridge' 에러가 발생했을 때 졸리운_곰 2024.05.01 202
138 [Android SDK] [안드로이드] Thread, TimerTask, Handler 반복 호출 만들기 JAVA 졸리운_곰 2024.05.01 157
137 [Android SDK] [Android] postDelayed()를 이용해서 주기적 메소드 실행 졸리운_곰 2024.05.01 144
136 [Android SDK] Making Android WebView autorefresh periodically 졸리운_곰 2024.05.01 168
135 [Android SDK] [안드로이드] 시스템 멈추기 - Sleep() 사용법 file 졸리운_곰 2024.05.01 140
134 [Android SDK] 안드로이드 스레드 예제. 스레드로 고민해보기. (Android Thread UseCase) file 졸리운_곰 2024.05.01 143
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED