Classe deveria retornar uma lista!

Olá a todos :slight_smile:

Tenho um programa que pesquisa uma frase no google e guarda o titulo e o url de cada um desses resultados numa classe chamada Resultados. No entanto, quando o dou uma frase para pesquisar o programa apenas me retorna o primeiro resultado obtido em vez da lista de resultados. Obrigado pela ajuda!

Classe Main:

package com.newschecker.demochecker;



import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.newschecker.demochecker.domain.Resultados;
import com.newschecker.demochecker.service.NewsCheckerService;



@SpringBootApplication
public class DemoCheckerApplication  implements CommandLineRunner{

	
	public static void main(String[] args) {
		SpringApplication.run(DemoCheckerApplication.class, args);
	}
	
	@Autowired
	NewsCheckerService service;
	
	@Override
	public void run(String... args) throws Exception {
		Resultados re = service.getResultadosGoogleProntos("Trump perdeu a peruca numa turbina de avião");
        System.out.print(re);
	}


  
}

Classe Service

package com.newschecker.demochecker.service;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.newschecker.demochecker.domain.Resultados;


@Service
public class NewsCheckerService {
	
		private static Logger log = LoggerFactory.getLogger(NewsCheckerService.class);
		
		public Resultados getResultadosGoogleProntos(String noticia) {
			
			Resultados resultados = new Resultados();
			
			noticia = isolaPalavrasChave(noticia);
			
			try {
				resultados = searchGoogle(noticia);
			} catch (IOException e) {
				log.error(e.getMessage(), e.getCause());
			}
			if (!isEmpty(resultados)) {
				return resultados;
			}
			else {
				return null;
			}
			
			
		}

	
	  // pattern for extracting the titulosResultados such as www.codeforeach.com/java/ ( domain
	  // name + path )
	    
		private static final Pattern p = Pattern
	      .compile("([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}(/[^&]*)*");
	    
	    public String isolaPalavrasChave(String frase) {
	        
	        String palavrasRetirar = " o - a - de - dos - das - na - nas - nos - no -.- quase -(-)-[-]-  " + 
				" que - se - com - que - é - um - as - os - para - do - da - no - nas - " + 
				" nos - na - para -...-,- uma - umas - numa - num - ao - aos - e -€-r$-?- já - ter "
	                        + " that - is - are - her - his - i - am - you - yours - him - to - of ";
			
			String[] palavrasChaveSeparadas = palavrasRetirar.split("-");
			
	        for (int x = 0; x < palavrasChaveSeparadas.length; x++){
	            frase = frase.replace(palavrasChaveSeparadas[x], " ");
	        }    
	        frase = frase.replace("  ", " ");
	        
	        return frase;
		
	    }
	    
	    
	    
	    String retiraAcentos(String input){ 
	        return input.replaceAll("á|à|â|ã|ä","a") .replaceAll("é|è|ê|ë","e"); }
	    
	    public String isolarLink(String frase) {
	        
	        String palavrasRetirar = "/-.pt-.com-.org-.com.br-.com.uk-https-::-//-http-.-:-    ";
			
			String[] palavrasChaveSeparadas = palavrasRetirar.split("-");
			
	        for (int x = 0; x < palavrasChaveSeparadas.length; x++){
	            frase = frase.replace(palavrasChaveSeparadas[x], " ");
	        }
	        frase = frase.replaceAll("-"," ");
	        frase = frase.replaceAll("  "," ");
	        
		return frase;
	    }
	    
	    public String removerSimbolos(String frase) {
	        
	        String palavrasRetirar = "|-,-...-  ";
			
	        String[] palavrasChaveSeparadas = palavrasRetirar.split("-");
			
	        for (int x = 0; x < palavrasChaveSeparadas.length; x++){
	            frase = frase.replace(palavrasChaveSeparadas[x], " ");
	        } 
	        
	        frase = frase.replace("  ", " ");
	        return frase;
	        
	    }
	    
	    public String removerAspasVirgulas(String frase) {
	    	
	        frase = frase.replaceAll("\""," ");
	        frase = frase.replaceAll(","," ");
	        frase = frase.replaceAll("  ", " ");
	        return frase;
	        
	    }

	   public Resultados searchGoogle(String searchQuery) throws IOException {
	        
	       Resultados result = new Resultados();
	    
	    // lets get the top results counting to nearly 15
	        String request = "https://www.google.com/search?q=" + searchQuery + "&num=10elton ";
	        
	        Document doc = Jsoup.connect(request)        
	        .userAgent("Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)").get();
	      
	    // get the required content from response . Here ( h3 a ) is the selector
	    // pattern for selecting all heading links
	    
	    //  System.out.println( "--> \n" + doc.toString() );
	        
	        Elements links = doc.select(".kCrYT");
	    
	        for (Element link : links) {
	            Elements el_a = link.select("a");
	     
	            String hrefValue = el_a.attr("href");    
	            Elements el_divs = el_a.select("div");
	      
	            String nome = "";
	            if(el_divs.size() > 0) {
	                nome = (String) el_divs.get(0).html();
	            }
	       
	            if (hrefValue.startsWith("/url?q=")) {
	          
	                try {
	             
	                    String slink = extractLink(hrefValue);
	            
	                    if( slink != null ) {             

	                    hrefValue = URLDecoder.decode(slink, StandardCharsets.UTF_8.toString());
	                    result.setTitulo(nome);
	                    result.setURL(hrefValue);
	                    }
	             
	                } catch (UnsupportedEncodingException ex) {
	                    throw new RuntimeException(ex.getCause());
	                } catch(java.lang.IndexOutOfBoundsException ie) {
	                    ie.printStackTrace();
	             
	                }
	          
	            }
	            
	        }

	        return result;
	    }

	  // extract required titulosResultados from href value
	    private static String extractLink(String href) {
	        
	        String result = null;
	        Matcher m = p.matcher(href);

	        if (m.find()) {
	            result = m.group();
	        }

	        return result;

	    }
	    
		private boolean isEmpty(Resultados news) {
			
			if (news.getTitulo().isEmpty()) return true;
			if (news.getURL().isEmpty()) return true;	
			
			return false;
		}

}

Classe Resultados:

package com.newschecker.demochecker.domain;


import java.io.Serializable;


@SuppressWarnings("serial")
public class Resultados implements Serializable {

	private String titulo;
	private String url;
	
	public String getTitulo() {
		return titulo;
	}
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	public String getURL() {
		return url;
	}
	public void setURL(String url) {
		this.url = url;
	}
    public String toString() {
        return "Titulo: "+ titulo + " Site: "+ url;
    }
}

Posso estar enganada, já faz algum tempo que não uso Spring e Java, mas não vi nada, em nenhuma das suas classes, que retorne uma lista. Algo como:

public List<String> urlResultados() {
        Resultados resultados = new Resultados();
		List<String> urlResultado = new ArrayList<String>();
		
		for(int i = 0; i < 10; i++) {
			urlResultado.add(resultados.get(i).getURL());
		}

		return urlResultado;
	}

O método acima retorna uma lista de 10 URLs a partir do objeto Resultados.

É apenas uma sugestão de resolução. :blush: :wink:

Mas não é isso que eu quero! :slight_smile:
Eu quero que quando dou uma frase para o programa ele guarde todos os links e titulo na classe Resultados, para depois poder ir busca-los quando quiser.

1 curtida

Entendi. Você já tentou usar o repositório do Spring?

1 curtida

Não! Como faço isso?! :slight_smile:

Eu não lembro como usar exatamente, como eu disse, jaz faz um tempo que não uso Spring, mas funciona mais ou menos assim:

Ele trabalha com MVC. Então na camada Model, você colocará a classe responsável por gerar o modelo para você. Ele gera inclusive a tabela no banco de dados. Aí você cria um repositório que estenderá as classes do JPA responsáveis pelo CRUD. E aí você pode fazer as solicitação no Controller.

Dá uma olhada nesse exemplo aqui.

Obrigado pela dica!

Mas eu nao preciso de guardar nenhuma informação em banco de dados! Com os resultados que ele recebe da pesquisa google, passa apenas por uns ifs e entrge um resultado ao utilizador. Não preciso de guardar nada, entendes? :slight_smile:

Tudo o que eu encontro usa banco de dados e para o meu projeto nao preciso!

1 curtida

Primeiro voce falou que queria guardar, para busca-los quando quiser. Agora nao quer guardar nada. Define melhor o que voce quer, para que as pessoas nao percam tempo.

1 curtida

Nossa, tem calma! :wink:
Se não quiseres não precisas de estar aqui a ajudar, ora essa! :smile:

O que eu queria dizer, era que nao preciso de utilizar banco de dados, nem de guardar informaçães! Recebe um input e imprime um resultado! Estu é a ter dificuldades em fazer isso! Por isso estou aqui a pedir ajuda, ok?! :wink:

Valeu!

Ok. Se for só a saída e você consegue imprimir um resultado, mude a estrutura para array list. ele vai pegar as informação, retornar uma lista e imprimir, mas não vai persistir dados, pois não tem onde persistir.

@ASHAMM na sua classe Resultado, crie uma list e crie os métodos gets e sets, após isso chame o método set em em for e armazene os resultados e os links e depois exiba eles conforme o desejado