2011-04-01 9 views
1
import org.jsoup.Jsoup; 
import javax.swing.*; 
import org.jsoup.helper.Validate; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.Scanner; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 


@SuppressWarnings("unused") 
public class SimpleWebCrawler extends JFrame { 

    JTextField yourInputField = new JTextField(20); 
    static JTextArea _resultArea = new JTextArea(100, 100); 
    JScrollPane scrollingArea = new JScrollPane(_resultArea); 
    private final static String newline = "\n"; 



    public SimpleWebCrawler() throws MalformedURLException { 

     String word2 = yourInputField.getText(); 


     _resultArea.setEditable(false); 



     try { 
      URL my_url = new URL("http://" + word2 + "/"); 
      BufferedReader br = new BufferedReader(new InputStreamReader(
        my_url.openStream())); 
      String strTemp = ""; 
      while (null != (strTemp = br.readLine())) { 
       _resultArea.append(strTemp + newline); 
      } 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     _resultArea.append("\n"); 
     _resultArea.append("\n"); 
     _resultArea.append("\n"); 


     String url = "http://" + word2 + "/"; 
     print("Fetching %s...", url); 

     try{ 
     Document doc = Jsoup.connect(url).get(); 
     Elements links = doc.select("a[href]"); 


     System.out.println("\n"); 

     BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\user\\fypworkspace\\FYP\\Link\\abc.txt")); 
     _resultArea.append("\n"); 
     for (Element link : links) { 
      print(" %s ", link.attr("abs:href"), trim(link.text(), 35)); 

      bw.write(link.attr("abs:href")); 
      bw.write(System.getProperty("line.separator")); 
     } 
     bw.flush(); 
     bw.close(); 
     } catch (IOException e1) { 

     } 
     JPanel content = new JPanel(); 
     content.setLayout(new BorderLayout()); 
     content.add(scrollingArea, BorderLayout.CENTER); 
     content.add(yourInputField); 



     this.setContentPane(content); 
     this.setTitle("Crawled Links"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     this.pack(); 




     } 

     private static void print(String msg, Object... args) { 

      _resultArea.append(String.format(msg, args) +newline); 
     } 

     private static String trim(String s, int width) { 
      if (s.length() > width) 
       return s.substring(0, width - 1) + "."; 
      else 
       return s; 


     } 

     //.. Get the content pane, set layout, add to center 




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



     JFrame win = new SimpleWebCrawler(); 
     win.setVisible(true); 



    } 
} 

안녕하세요, 이것은 웹 주소에서 링크를 추출하는 코드입니다. 사용자가 원하는 URL을 입력하면이 코드는 URL에서 링크를 추출합니다.잘못된 인수 예외가 발생했습니다.

이 코드는 사용자가 ECLIPSE IDE 콘솔에서 URL을 입력하도록 요청합니다. 입력을 키 입력하면 코드는 URL에서 링크를 추출하여 출력을 JTextArea로 전송합니다.

내가 지금하고 싶은 것은 콘솔의 입력에 사용자 키가 아닌 사용자 입력을받는 Jtextfield를 생성하고 싶습니다.

문자열 입력을 처리하기위한 책임이 코드 줄은 다음과 같습니다

URL my_url = new URL("http://" + word2 + "/"); 
String url = "http://" + word2 + "/"; 

그러나 나는 무엇을 놓치고 않는

protocol = http host = null. 

설명하는 불법 인수 예외를 받고?

답변

0

개체가 생성되면 새로운 JTextField가 생성됩니다. 그러나이 JTextField를 어디에도 표시하지 않으므로 사용자는 데이터를 입력 할 수 없습니다. 데이터를 입력 할 수 없으므로 새로 작성된 JTextField는 getText()를 호출 할 때 null을 반환합니다.

가장 좋은 방법은 폼에 JTextField를 표시하고 누군가가 "시작"을 클릭 한 후에 만 ​​HTTP 크롤링을 실행하거나 더 나은 방법으로 생성자를 변경하여 해당 생성자의 기본 호스트 인 문자열 인수를 허용하는 것입니다. 다운로드하려는 URL. 그런 다음 SimpleWebCrawler가 모든 작업을 수행 한 다음 양식을 표시하는 다른 클래스를 작성할 수 있습니다.

public SimpleWebCrawler(String word2) throws MalformedURLException { 

    // We don't need this any more 
    //String word2 = yourInputField.getText(); 

    _resultArea.setEditable(false); 



    try { 
     URL my_url = new URL("http://" + word2 + "/"); 
     BufferedReader br = new BufferedReader(new InputStreamReader(
       my_url.openStream())); 
     String strTemp = ""; 
     while (null != (strTemp = br.readLine())) { 
      _resultArea.append(strTemp + newline); 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    // Rest of your constructor goes here... 
+0

안녕하세요, 내 코드 모양에서 jtextfield를 올바르게 만드시겠습니까? 내가 입력을 입력하고 코드를 실행하려면 사용자에게 묻는 jtextfield가 필요합니다. – jasper

+0

먼저 JTextField를 만든 다음 표시하고 사용자가 텍스트를 입력하도록 한 다음 해당 텍스트가있는 웹 크롤러를 실행해야합니다. 현재 사용자가 텍스트를 입력 할 수 있기 전에 웹 크롤러를 실행하고 있습니다. – Gnat

+0

SimpleWebCrawler 클래스 외부에서 텍스트 필드를 만들어야한다는 의미입니까? – jasper

0

여기에서 문제는 URL을 너무 일찍 만들려고한다는 것입니다. 심지어 GUI를 만들기 전에. 그래서 word2은 단지 빈 문자열이므로 URL은 "http:///"과 같이 유효하지 않습니다. JButton을 추가하고 버튼을 누르면 웹 페이지에서 링크를 추출해보십시오.

관련 문제