Programming/Android

[Android] 웹페이지 파싱하기 - Jsoup 사용.

쌍쌍바나나 2016. 4. 28. 07:54
반응형

앞서 사용하는 방법을 설명했고, 이제는 실전이다. 

무한도전의 회차 정보를 가져오는 내용을 해보았고, 페이지에서 전체 내가 원하는 회차 프로그램 정보를 가져오는 방법을 설명하겠다. 


일단 무한도전의 회차 정보를 가져오기 위해서 확인해본 결과 아래와 같은 구조를 가지고 있었다.










<div class="brcs_thumb"> .... </div>는 이미지의 URL을 담고 있었고,

<div class="brcs_detail" id="brcs_detail"> ... </div> 에는 회차정보인 택스트 정보를 담고 있었다. 


안에를 자세하게 살펴보면




소스코드 


Elements image = doc.select("div.brcs_thumb");
for (Element e : image) {
	// System.out.println(e);
	for (Element k : e.children()) {
		// System.out.println(k);
		for (Element y : k.children()) {
//			System.out.println(y);
			Elements i = y.getElementsByTag("img");
			for (Element j : i) {
				System.out.println(j.data() +", " + j.tag() +", " +j.attributes()+ ", " + j.attr("src"));
				System.out.println(j.attr("src"));
			}
		}
	}
}







이 부분에서는 <img src의 내용이 필요했고, 무한도전 이미지





소스코드 


Elements contents = doc.select("dl.nomar");

for (Element e : contents) {
	Elements children = e.children();

	Elements k = e.select("dt.dss_h_episode_intro dd a href");
	for (Element e2 : k) {
		System.out.println("child " + e2.tagName() + ", " + e2.className() + ", " + e2.text());
	}

	for (Element e1 : children) {
		Elements links = e1.getElementsByTag("a");
		for (Element link : links) {
			String linkHref = link.attr("href");
			String linkText = link.text();
			// https://search.naver.com/search.naver
			System.out.println(linkHref + ", " + linkText);
		}
		System.out.println("child " + e1.tagName() + ", " + e1.className() + ", " + e1.text());
	}
	System.out.println(e.tagName() + ", " + e.className() + ", " + e.text());
}




public class Application {
	public static void main(String[] args) throws IOException {

		String url = "https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&ie=utf8&query=무한도전+20160423";
		Document doc = Jsoup.connect(url)
				.header("content-type", "multipart/form-data; boundary=---011000010111000001101001")
				.header("authorization", "Basic ZmJfMTY2MTUzMDc0NzQ2MTk5NDox").header("cache-control", "no-cache")
				.get();
		
		// thumb image 가져오기
		Elements brcsThumbElements = doc.select("div.brcs_thumb");
		// System.out.println(brcsThumbElements);
		System.out.println(brcsThumbElements.select("a").get(0).getElementsByTag("img").attr("src"));

		// broadcast info 가져오기
		Elements brcsDetailElements = doc.select("div.brcs_detail");
		// System.out.println(brcsDetailElements);
		Elements dlNomarElements = brcsDetailElements.select("dl.nomar");
		Elements infoElements = dlNomarElements.get(0).children();
		ArrayList infos = new ArrayList<>();
		String[] row = new String[2];
		for (Element infoElement : infoElements) {
			if (infoElement.tagName().equals("dt")) {
				row = new String[2];
				row[0] = infoElement.text();
			} else if (infoElement.tagName().equals("dd")) {
				row[1] = infoElement.text();
				infos.add(row);
			}
		}
		for (String[] r : infos) {
			System.out.println(r[0] + " : " + r[1]);
		}
	}
}












반응형