2016-04-26 2 views
0

J'expérimente JSoup et je n'arrive pas à faire fonctionner ma 2ème remise de gaz avec mon scanner. Il passe directement à ma déclaration catch.Fermeture du programme Java avant que le scanner ne prenne l'entrée 2ieme fois

Voici une description du programme:

Je prends un terme de recherche google comme entrée utilisateur (String). Ensuite, je demande le nombre d'éléments de requête que l'utilisateur souhaite voir, et entrez un nombre entier.

Je parcourt chaque élément renvoyé et l'ajoute à une ArrayList. La chaîne affichée sur la console comprend un index, un texte de lien et un lien hypertexte.

Ensuite, je veux demander à l'utilisateur quel index ils aimeraient entrer pour ouvrir une fenêtre de navigateur menant à ce lien. Ceci est fait en cocantenant la chaîne hRef avec la commande de terminal Linux "xdg-open" en utilisant la classe Runtime.

Cela fonctionne très bien jusqu'à ce qu'il est temps de demander quel index sera choisi.

Voici mon code:

/** 
* Created by christopher on 4/26/16. 
*/ 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Scanner; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 


public class GoogleSearchJava { 

    static int index; 
    static String linkHref; 
    static Scanner input; 

    public static final String GOOGLE_SEARCH_URL = "https://www.google.com/search"; 

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

     //GET INPUT FOR SEARCH TERM 

     input = new Scanner(System.in); 
     System.out.print("Search: "); 
     String searchTerm = input.nextLine(); 
     System.out.print("Enter number of query results: "); 
     int num = input.nextInt(); 

     String searchURL = GOOGLE_SEARCH_URL + "?q=" + searchTerm + "&num=" + num; 

     //NEED TO DEFINE USER AGENT TO PREVENT 403 ERROR. 
     Document document = Jsoup.connect(searchURL).userAgent("Mozilla/5.0").get(); 

     //OPTION TO DISPLAY HTML FILE IN BROWSWER. DON'T KNOW YET. 
     //System.out.println(doc.html()); 

     //If google search results HTML change the <h3 class="r" to <h3 class ="r1" 
     //need to change below stuff accordingly 
     Elements results = document.select("h3.r > a"); 

     index = 0; 
     String news = "News"; 
     ArrayList<String> displayResults = new ArrayList<>(); 
     for (Element result : results) { 
      index++; 
      linkHref = result.attr("href"); 
      String linkText = result.text(); 
      String pingResult = index + ": " + linkText + ", URL:: " + linkHref.substring(6, linkHref.indexOf("&")) + "\n"; 

      if (pingResult.contains(news)) { 
       System.out.println("FOUND " + "\"" + linkText + "\"" + "NO HYPERTEXT FOR NEWS QUERY RESULTS AT THIS TIME. SKIPPED INDEX."); 
       System.out.println(); 
      } else { 
       displayResults.add(pingResult); 
      } 
     } 
     for(String urlString : displayResults) { 
      System.out.println(urlString); 
     } 
     System.out.println(); 

     goToURL(input, displayResults); 
    } 
    public static int goToURL(Scanner input, ArrayList<String> resultList) { 

     int newIndex = 0; 

     try { 

      System.out.print("Enter Index (i.e. 1, 2, etc) you wish to visit, 0 to exit: "); 

      newIndex = input.nextInt(); 
      input.nextLine(); 

      for (String string : resultList) { 

       if(string.startsWith(String.valueOf(newIndex))) { 

        Process process = Runtime.getRuntime().exec("xdg-open " + string.substring(6, string.indexOf("&"))); 
        process.waitFor(); 
       } 
      } 
     } catch (Exception e) { 
      System.out.println("ERROR while parsing URL"); 
     } 
     return newIndex; 
    } 
} 

EST ICI LA SORTIE Remarquez comment il arrête après j'entre « 1 » Non, je n'ai pas pris en charge en appuyant sur « 0 » encore:

Search: Oracle 
Enter number of query results: 3 
1: Oracle | Integrated Cloud Applications and Platform Services, URL:: =http://www.oracle.com/ 

2: Oracle Corporation - Wikipedia, the free encyclopedia, URL:: =https://en.wikipedia.org/wiki/Oracle_Corporation 

3: Oracle on the Forbes America's Best Employers List, URL:: =http://www.forbes.com/companies/oracle/ 


Enter Index (i.e. 1, 2, etc) you wish to visit, 0 to exit: 1 
ERROR while parsing URL 

Process finished with exit code 0 
+0

Voir aussi [Lorsque Runtime.exec() ne sera pas] (http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html) pour de nombreux bons conseils sur la création et la gestion d'un processus correctement. Puis ignorez qu'il se réfère à 'exec' et utilisez un' ProcessBuilder' pour créer le processus. –

Répondre

1

ERROR while parsing URL suggère que l'erreur provient de

try { 

    System.out.print("Enter Index (i.e. 1, 2, etc) you wish to visit, 0 to exit: "); 

    newIndex = input.nextInt(); 
    input.nextLine(); 

    for (String string : resultList) { 

     if(string.startsWith(String.valueOf(newIndex))) { 

      Process process = Runtime.getRuntime().exec("xdg-open " + string.substring(6, string.indexOf("&"))); 
      process.waitFor(); 
     } 
    } 
} catch (Exception e) { 
    System.out.println("ERROR while parsing URL"); 
} 

Je ne travaille pas sur Linux donc je ne peux pas le tester mais je suspecte que votre URL ne commence pas par = (vous remarquerez que votre console contient URL:: =... où votre instruction d'impression n'a pas cette = donc elle fait partie de adresse que vous essayez de visiter).

Donc, changer .substring(6, hRef.indexOf("&"))6 en 7.


Autre problème est que hRef est défini comme linkHref qui sera le dernier résultat de Google que vous avez choisi. Vous devriez probablement créer votre propre classe qui va stocker href propre et sa description, ou passer liste de Element représentant <a ...>..</a> éléments que vous avez choisi (aussi vous ne devez pas vérifier les éléments de la liste en fonction de leur format 1: ..., utilisez simplement list.get(index - 1) si vous voulez mapper 1 pour indexer 0, 2 pour indexer 1 et ainsi de suite).


Dernier conseil pour est maintenant que vous pouvez changer votre code pour être plus indépendant de l'OS avec une solution décrite ici How to open the default webbrowser using java plutôt que d'essayer d'exécuter xdg-open

+0

J'ai obtenu le code de la classe Desktop à partir du lien ci-dessus, mais je ne suis pas sûr de savoir comment implémenter votre suggestion pour la variable linkHRef. – IRGeekSauce

+1

@IRGeekSauce J'ai essayé de simplement un peu de code. Vous pouvez le trouver ici http: // pastebin.com/VTNey8H8 (Je ne veux pas ajouter de solution complète ici car cela rendrait cette réponse trop large). – Pshemo

+0

Allez-y et postez votre code ici. Je l'ai essayé et ça fonctionne PARFAITEMENT. J'accepterai volontiers votre réponse. :) – IRGeekSauce