일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 크롤링
- SQL
- SQL입문
- 크롤링 오류
- 숫자형식오류
- dbms
- 배열 예제
- 함수 선언
- 키-값 데이터베이스
- R1C3
- 페이지분석
- 예제
- Doit입문SQL
- 예외
- html
- 함수
- 자바
- DoitSQL
- 웹 브라우저 전쟁
- DoitSQL입문
- 웹브라우저 수용도
- 생성자
- 데이터베이스
- 숫자 형식
- 자바 오류
- 배열 3요소
- DoIt
- 자바 예외
- 우아한테크
- HTML역사
Archives
- Today
- Total
프로그래밍
[자바 오류]java.util.NoSuchElementException 본문
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