lezam682
99
2018-07-26 12:15:43 작성 2018-07-26 12:16:53 수정됨
6
2710

Jsoup 뉴스 크롤링 이미지


    ArrayList<String> img = new ArrayList<String>()
private String pageUrl = "http://realestate.daum.net/news/all?page=";

				//이미지
				Elements ilink = doc.select("#live > ul > li > a");
				for (Element el5 : ilink) {
					Document doc5 = Jsoup.connect(el5.attr("abs:href")).get();
				Elements eImg = doc5.select("#dmcfContents > section > figure > img");
				
				for(Element et5:eImg) {
//					System.out.println(et5.toString(
					
					if(et5.attr("abs:src")!=""){
						img.add(et5.attr("abs:src"));		
					}else {
						img.add("");
					}

 Jsoup 웹크롤링 프로젝트중 제목,내용 등 arraylist에 담고 db에 저장 및 출력까지 완료하였습니다.

마지막으로 이미지를 넣을려고하는데 doc5.select("#dmcfContents > section > figure > img")

여기서 img src 내용을 뽑아올려는데 이미지가 없는기사에는 ("#dmcfContents > section > figure > img") 태그가 없습니다. 그래서 index가 title,content 등과 맞지않아 실행이 안될줄알았는데 또 문제는 이미지가 2개이상인 경우 2번째 이상부터의 이미지를 다음 데이터에 저장하면서 밀리면서 실행이 되는데 다른기사의 사진이 있다던가 이미지없는기사와 사진이1개인기사만 모여있으면 index값이 맞자않아 출력이 안될때도있습니다.(if~else틀려서 안되는거겠지만 ㅠ)

혼자서 개발해보는거고 아직 미숙한초보라 그런지 jsoup에 api를 참조해도 어떤걸 써야할지도 잘모르겠고 오랫동안 건들이지를 못하고있네요 ㅠㅠ 도와주세요 고수님들

0
  • 답변 6

  • NG
    2k
    2018-07-26 15:02:14

    1. 이미지 엘리먼트를 select 한다.

    2. 엘리먼트 수가 0개면 img.add("");

    아니면 img.add(첫번째 엘리먼트);


    이러면 되는 거 아닌가요?

    Elements ilink = doc.select("#live > ul > li > a");
    for (Element el5 : ilink) {
    	Document doc5 = Jsoup.connect(el5.attr("abs:href")).get();
    	Elements eImg = doc5.select("#dmcfContents > section > figure > img");
    	if(eImg.size() == 0) {
    		img.add("");
    	} else {
    		img.add(eImg.get(0).attr("abs:src"));
    	}
    }


  • lezam682
    99
    2018-07-26 15:25:51 작성 2018-07-26 15:28:00 수정됨

    답변감사합니다


    for (int i = 0; i < title.size(); i++) {
    				NewsDTO dto = new NewsDTO(title.get(i),(content.get(i)), writer.get(i), writeDate.get(i),img.get(i));

    지금 가장 큰문제가 title.size()가 20이면 content ...등 size()가 20으로 다같아야하는데

    img의 문제는 각 기사마다 사진이 2개인경우도 있고 1개 , 0개인 경우도 있습니다. 

    2개의 사진일경우 다음 기사이미지에 저장이되면서 순서가 밀리면서 size가 20일 넘을때도 있습니다.

    2개의 사진을 포함되어있는 기사에서는 1개만 꺼내고 싶은데. 도저히 모르겠습니다..

    사진이 포함되어있지 않은 기사는 figure > img 태그가 없습니다..ㅠ 반대로 

    2개의 사진을 갖고있는 기사(http://realestate.daum.net/news/detail/all/20180726110010961)

    에서는 figure 가 2개가 있는데 nth-child로 안잡힙니다 ..  select부터 어떻게 잡아야하는건지..ㅠㅠ



  • NG
    2k
    2018-07-26 16:00:25

    위에 알려드렸잖아요.

    	if(eImg.size() == 0) { // 이미지가 0개이면
    		img.add("");  // 순서를 맞추기 위해 빈값 추가
    	} else {  // 0개가 아니면
    		img.add(eImg.get(0).attr("abs:src"));  // 첫번째 이미지의 src를 추가
    	}
  • lezam682
    99
    2018-07-26 16:42:59


    ArrayList<String> img = new ArrayList<String>();


    Elements ilink = doc.select("#live > ul > li > a");
    			for (Element el5 : ilink) {
    				Document doc5 = Jsoup.connect(el5.attr("abs:href")).get();
    				Elements eImg = doc5.select("#dmcfContents > section > figure > img");
    
    				for (Element et5 : eImg) {
    					System.out.println(eImg.size());
    					if(eImg.size() == 0) {
    						img.add("안녕");
    					}else {
    						img.add(eImg.get(0).attr("abs:src"));
    					}
    				}
    			}
    //			if(eImg.size()>1) {
    //				img.add(eImg.get(0).attr("abs:src"));
    //			}
    //			else if (eImg.size() == 0) {
    //				img.add("키득");
    //			}else {
    //				img.add("안녕");
    //			}
    //		}
    //	}

    답변감사합니다..제가 많이부족해서 eImg.size()에 대한 이해가 부족했는데

    NG님덕분에 조금 이해가됐습니다. 조언대로 했지만  title,content,writedate size()은 20이지만

    img.size()는 여전히 밀리는지 index를 초과합니다..ㅠ

  • NG
    2k
    2018-07-26 17:25:13

    아직 소스 해석이 잘 안되시나보네요.

    님께서 올리신 소스에 첨삭해드릴테니 참고해보세요.

    for (Element el5 : ilink) {
      Document doc5 = Jsoup.connect(el5.attr("abs:href")).get();
      Elements eImg = doc5.select("#dmcfContents > section > figure > img");
    
      for (Element et5 : eImg) { // 필요없음
    	System.out.println(eImg.size());
            if(eImg.size() == 0) {
              img.add("안녕");
            }else {
              img.add(eImg.get(0).attr("abs:src"));
            }
       }// 필요없음
    }

    부연설명을 드리면

    이미지 수만큼 for문을 돌면서 이미지 리스트에 값을 추가하고 있기 때문에 제목과 이미지의 수가 안맞는 겁니다.

    제가 처음 리플에 알려드린 것은 이미지 개수랑 상관없이 게시물 하나 당 이미지를 하나만 추가하도록 한 것이고요,

    바로 위에 님께서 올린 소스는 for문을 남겨둔 상태에서 제가 알려드린 소스를 추가해서 여전히 리스트 크기가 안맞았던 겁니다.


  • lezam682
    99
    2018-07-26 17:45:31

    감사합니다 한번더 코딩보면서 이해하면서 공부하겠습니다.

    img 전까지는 모두 이런식으로 for문을 돌렸습니다 당연시여겨 코딩을 제대로해석하지못했어여

    정말 감사합니다

  • 로그인을 하시면 답변을 등록할 수 있습니다.