2016-04-26 19 views
0

nehmen Ich experimentiere mit JSoup, und ich kann nicht mein 2. Durchstarten mit meinem Scanner zu arbeiten. Es springt direkt zu meiner Catch-Anweisung.Java-Programm geschlossen, bevor Scanner kann das zweite Mal um

Hier ist eine Beschreibung des Programms:

Ich nehme eine Google-Suche Begriff als Benutzereingabe (String). Als nächstes frage ich nach der Anzahl von Abfrageelementen, die der Benutzer sehen möchte, und gebe eine Ganzzahl ein.

Ich Schleife durch jedes Element, das zurückgegeben wird, und fügen Sie es zu einer ArrayList hinzu. Die Zeichenfolge, die auf der Konsole angezeigt wird, besteht aus einem Index, einem Linktext und einem Hyperlink.

Ich möchte dann den Benutzer fragen, welchen Index sie eingeben möchten, um ein Browserfenster zu öffnen, das zu diesem Link führt. Dies geschieht, indem die hRef-Zeichenfolge mit dem Linux-Terminal-Befehl "xdg-open" unter Verwendung der Runtime-Klasse cokantiert wird.

Es funktioniert gut, bis es Zeit ist zu fragen, welcher Index gewählt wird.

Hier ist mein 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; 
    } 
} 

HIER IST DER Hinweis OUTPUT wie es stoppt, nachdem ich "1" eingeben Nein, ich habe noch nicht gekümmert "0" drücken:

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

Siehe auch [Wenn Runtime.exec() nicht] auszuführen, (http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html) für viele gute Tipps zum korrekten Erstellen und Bearbeiten eines Prozesses. Dann ignoriere es auf 'exec' und verwende einen' ProcessBuilder' um den Prozess zu erstellen. –

Antwort

1

ERROR while parsing URL legt nahe, dass Fehler von

kommt
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"); 
} 

Ich arbeite nicht an Linux, also kann ich es nicht testen, aber ich vermute, dass Ihre URL nicht mit = beginnen sollte (Sie werden feststellen, dass Ihre Konsole URL:: =... enthält, wo Ihre Druckanweisung diese = nicht enthält Adresse, die Sie besuchen möchten).

So ändern Sie in .substring(6, hRef.indexOf("&"))6 zu 7.


Andere Problem ist, dass hRef gesetzt linkHref zu sein, das letzte Ergebnis wird von Google Sie ausgewählt. Sie sollten wahrscheinlich Ihre eigene Klasse erstellen, die die richtige href und ihre Beschreibung speichert oder die Liste Element darstellt, die <a ...>..</a> Elemente darstellt, die Sie ausgewählt haben (Sie müssen auch keine Elemente in der Liste basierend auf ihrem 1: ... Format überprüfen, verwenden Sie einfach list.get(index - 1) wenn Sie möchte 1 zu Index 0 zuordnen, 2 zu Index 1 usw.).


Letzte Tipps für heute ist, dass Sie Ihren Code ändern können mehr OS mit Lösung hier How to open the default webbrowser using java beschrieben, unabhängig zu sein, anstatt zu versuchen xdg-open

+0

Ich habe den Desktop-Klassencode von dem obigen Link funktioniert, aber ich bin mir nicht sicher, wie Sie Ihren Vorschlag für die Variable linkHRef implementieren. – IRGeekSauce

+1

@IRGeekSauce Ich habe versucht, einfach Ihren Code ein wenig. Sie können es hier finden http: // Pastebin.com/VTNey8H8 (Ich möchte hier keine vollständige Lösung hinzufügen, da diese Antwort zu weit gefasst wäre). – Pshemo

+0

Gehen Sie voran und schreiben Sie Ihren Code hier. Ich habe es ausprobiert und es funktioniert PERFEKT. Ich werde deine Antwort gerne annehmen. :) – IRGeekSauce