2016-04-26 5 views
0

Я экспериментирую с JSoup, и я не могу получить свой второй ход с моим сканером. Он пропускает прямо к моему заявлению catch.Запуск программы Java перед сканером может принимать входной сигнал 2-й раз около

Вот описание программы:

Я беру слово для поиска Google в качестве пользовательского ввода (String). Затем я запрашиваю количество элементов запроса, которые пользователь хочет видеть, и введите целое число.

Я прохожу через каждый возвращаемый элемент и добавляю его в ArrayList. Строка, отображаемая на консоли, состоит из индекса, текста ссылки и гиперссылки.

Затем я хочу спросить у пользователя, какой индекс они хотели бы ввести, чтобы открыть окно браузера, ведущее к этой ссылке. Это делается путем коактивации строки hRef с помощью команды терминала Linux «xdg-open» с использованием класса Runtime.

Он отлично работает, пока не пришло время спросить, какой индекс будет выбран.

Вот мой код:

/** 
* 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; 
    } 
} 

ВОТ ВЫВОД Обратите внимание, как он останавливается после того, как я войду «1» Нет, я не позаботился нажатие «0» пока:

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

Смотрите также [Когда Runtime.exec() не будет] (http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html) для многих хороших советов по правильному созданию и обработке процесса. Затем проигнорируйте это, ссылаясь на 'exec' и используйте' ProcessBuilder' для создания процесса. –

ответ

1

ERROR while parsing URL предполагает, что ошибка происходит из

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

Я не работаю над Linux, поэтому я не могу его протестировать, но я подозреваю, что ваш url shoulnd't не начинается с = (вы заметите, что ваша консоль содержит URL:: =..., где в вашем заявлении на печать нет этого =, поэтому он является частью адрес, который вы пытаетесь посетить).

Итог: .substring(6, hRef.indexOf("&"))6 - 7.


Другая проблема заключается в том, что hRef устанавливается равным linkHref, который будет последним результатом Google вы выбрали. Вероятно, вы должны создать свой собственный класс, который сохранит надлежащее href и его описание, или список пересылки Element, представляющий <a ...>..</a> элементов, которые вы выбрали (также вам не нужно проверять элементы в списке на основе их формата 1: ..., просто используйте list.get(index - 1), если вы хотите сопоставить 1 с индексом 0, 2 с индексом 1 и т. д.).


Последний совет сейчас является то, что вы можете изменить свой код, чтобы быть более независимыми ОС раствором описано здесь How to open the default webbrowser using java, а не пытаться выполнить xdg-open

+0

У меня есть код рабочего стола, работающий по указанной выше ссылке, но я не уверен, как реализовать ваше предложение для переменной linkHRef. – IRGeekSauce

+1

@IRGeekSauce Я попробовал просто ваш код немного. Вы можете найти его здесь http: // pastebin.com/VTNey8H8 (я не хочу здесь добавлять полное решение, так как этот ответ слишком широк). – Pshemo

+0

Вперед и разместите свой код здесь. Я попробовал, и он работает ОТЛИЧНО. Я с радостью приму ваш ответ. :) – IRGeekSauce