프로그래밍

[자바 오류]java.util.NoSuchElementException 본문

오류

[자바 오류]java.util.NoSuchElementException

시케 2023. 6. 3. 23:38
728x90
반응형

Exception in thread "main" java.util.NoSuchElementException

at java.base/java.util.ArrayList$Itr.next(ArrayList.java:970)

at model.Crawling.sample(Crawling.java:49)

at model.ProductDAO.<init>(ProductDAO.java:10)

at ctrl.Ctrl.<init>(Ctrl.java:19)

at client.Client.main(Client.java:7)

찾을 수 없는 요소를 가지고 오려 함

 

 

해당 문제는 크롤링을 하다가 발생한 오류이다

한 상품의 이름, 현재 판매가(할인가), 기존 가격을 가져와서 이터레이터로 하나씩 꺼내는 중 발생하였다

이름, 현재 판매가는 무조건 존재하나 기존 가격이 존재하지 않는 경우도 있어서 요소의 갯수가 일치하지 않아 발생하였다

 

해결 방안

현재 판매가, 기존 가격을 하나의 태그로 뭉쳐서 가져온 후

현재 판매가를 제거하는 방식으로 하였다

 

기존 코드

package model;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Crawling {

   public static ArrayList<ProductVO> sample() {

      final String url = "https://www.oliveyoung.co.kr/store/main/getBestList.do";

      Connection conn = Jsoup.connect(url);
      Document doc = null;
      try {
         doc = conn.get();
      } catch (IOException e) {
         e.printStackTrace();
      }

      Elements elems = doc.select("p.tx_name");
      Elements elems2 = doc.select("p.prd_price > span.tx_cur > span.tx_num");
      Elements elems3 = doc.select("p.prd_price > span.tx_org > span.tx_num");

      Iterator<Element> itr = elems.iterator();
      Iterator<Element> itr2 = elems2.iterator();
      Iterator<Element> itr3 = elems3.iterator();

      //////////////////////////////
      ArrayList<ProductVO> mdatas = new ArrayList<ProductVO>();
      int PK = 1001;
      //////////////////////////////

      while (itr.hasNext()) {
         String str = itr.next().text();
         String str2 = itr2.next().text();
         String str3 = itr3.next().text();

         str2 = str2.replace(",", "");
         str3 = str3.replace(",", "");
         int price1 = Integer.parseInt(str2);
         int price2 = Integer.parseInt(str2);
         
         // 100-((원가격/할인가)*100)
         price2 = 100-((price1/price2)*100);

         mdatas.add(new ProductVO(PK++, str, price1,price2));
      }

      return mdatas;

   }

}

 
변경 코드

package model;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Crawling {

	public static ArrayList<ProductVO> sample() {
		
		final String url = "https://www.oliveyoung.co.kr/store/main/getBestList.do";

		Connection conn = Jsoup.connect(url);
		Document doc = null;
		try {
			doc = conn.get();
		} catch (IOException e) {
			e.printStackTrace();
		}

		Elements elems = doc.select("p.tx_name");
		Elements elems2 = doc.select("p.prd_price > span.tx_cur > span.tx_num");
		Elements elems3 = doc.select("p.prd_price");


		Iterator<Element> itr = elems.iterator();
		Iterator<Element> itr2 = elems2.iterator();
		Iterator<Element> itr3 = elems3.iterator();

		//////////////////////////////
		ArrayList<ProductVO> mdatas = new ArrayList<ProductVO>();
		int PK = 1001;
		//////////////////////////////

		while (itr.hasNext()) {
			String str = itr.next().text();
			String str2 = itr2.next().text();
			String str3 = itr3.next().text();

			str2 = str2.replaceAll("[^0-9]", "");
			str3 = str3.replaceAll("[^0-9]", "");

			if(str3.equals(str2)) {
				str3 = "-1";
			}
			else {
				str3 = str3.replace(str2, "");		
			}

			int price1 = Integer.parseInt(str2);
			int price2 = Integer.parseInt(str3);
			

			if(price2<0) {
				price2 = 0;
			}
			else {
				// 할인률: 100-((원가격/할인가)*100)
				double tmp = 100-((price1*1.0/price2*1.0)*100.0);
				price2 = (int) tmp;
			}

			System.out.println(price2);
			mdatas.add(new ProductVO(PK++, str, price1, price2));
		}

		return mdatas;

	}

}
728x90
반응형
Comments