Quelltext aus Webseiten auslesen (Java): Unterschied zwischen den Versionen

Aus Byte-Welt Wiki
Zur Navigation springenZur Suche springen
K
K
Zeile 3: Zeile 3:
 
Welche davon genutzt wird, hängt z.T. von den persönlichen Vorlieben, von der Ziel-JRE, oder den angebotenen Methoden ab.
 
Welche davon genutzt wird, hängt z.T. von den persönlichen Vorlieben, von der Ziel-JRE, oder den angebotenen Methoden ab.
  
 +
==Auf das Wesentliche reduziert==
 
<syntaxhighlight lang="java">
 
<syntaxhighlight lang="java">
 
URL url = new URL("http://www.byte-welt.net");
 
URL url = new URL("http://www.byte-welt.net");
Zeile 12: Zeile 13:
 
JTextArea ta = new JTextArea();
 
JTextArea ta = new JTextArea();
 
while(scanner.hasNextLine()) {
 
while(scanner.hasNextLine()) {
   ta.append(scanner.nextLine()+"\n");
+
   ta.append(scanner.nextLine()+"\n\r");
 
}
 
}
  
Zeile 18: Zeile 19:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
In diesem Beispiel würden wir den ausgelesenen Quelltext in einer {{JAPI|JTextArea}} ausgeben.
 
In diesem Beispiel würden wir den ausgelesenen Quelltext in einer {{JAPI|JTextArea}} ausgeben.
 +
 +
==Ein Beispiel-Programm==
 +
<syntaxhighlight lang="java">
 +
import java.io.*;
 +
import java.awt.*;
 +
import java.awt.event.*;
 +
import java.net.*;
 +
import java.util.*;
 +
import javax.swing.*;
 +
 +
public class GrapHtmlDemo {
 +
  private JTextField targetField;
 +
  private JTextArea tArea;
 +
  private JTabbedPane tabbedPane;
 +
 +
  public GrapHtmlDemo(String title) {
 +
      JPanel panel = new JPanel(new BorderLayout());
 +
      targetField = new JTextField();
 +
      targetField.addActionListener(new TargetFieldAction());
 +
      tabbedPane = new JTabbedPane();
 +
      tabbedPane.setTabPlacement(JTabbedPane.BOTTOM);
 +
      tArea = new JTextArea();
 +
      tabbedPane.addTab("Content", new JScrollPane(tArea));
 +
 +
      panel.add(targetField, BorderLayout.NORTH);
 +
      panel.add(tabbedPane, BorderLayout.CENTER);
 +
 +
      JFrame frame = new JFrame(title);
 +
      Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
 +
      frame.setSize(dim.width * 66 / 100, dim.height * 66 / 100);
 +
      frame.setLocationRelativeTo(null);
 +
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 +
      frame.add(panel);
 +
      frame.setVisible(true);
 +
  }
 +
 +
  private void readContent(URL url) throws Exception {
 +
      Scanner scan = new Scanner(url.openStream());
 +
      if (scan != null) {
 +
        while(scan.hasNextLine()) {
 +
            tArea.append(scan.nextLine()+"\n\r");
 +
        }
 +
      }
 +
  }
 +
 +
  public static void main(String[] args) {
 +
      try {
 +
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
 +
      }
 +
      catch(Exception e) {
 +
        System.err.println(e);
 +
      }
 +
 +
      SwingUtilities.invokeLater(new Runnable() {
 +
        @Override
 +
        public void run() {
 +
            new GrapHtmlDemo("HTML-Code von Webseiten");
 +
        }
 +
      });
 +
  }
 +
 +
  class TargetFieldAction extends AbstractAction {
 +
      @Override
 +
      public void actionPerformed(ActionEvent e) {
 +
        if(tabbedPane.getTabCount() > 1) {
 +
            tabbedPane.remove(1);
 +
        }
 +
        String urlString = targetField.getText().trim();
 +
        try {
 +
            readContent(new URL(urlString));
 +
        }
 +
        catch(Exception ex) {
 +
            JTextArea eArea = new JTextArea(ex.toString());
 +
            eArea.setBackground(Color.PINK);
 +
            tabbedPane.addTab("Error", new JScrollPane(eArea));
 +
            tabbedPane.setSelectedIndex(1);
 +
        }
 +
      }
 +
  }
 +
}
 +
</syntaxhighlight>
  
 
[[Kategorie:Java-Codeschnipsel]]
 
[[Kategorie:Java-Codeschnipsel]]

Version vom 4. April 2018, 10:07 Uhr

Wenn man Webseiten bearbeiten oder parsen möchte, muss zunächst der Quelltext der Webseite geholt werden. Dazu wird ein Stream zur Datenquelle erzeugt. Es gibt mehrere Möglichkeiten, den Quelltext aus einem Stream in den Speicher einzulesen. Z.B. stehen uns hier die Klassen Scanner oder BufferedReader zur Verfügung. Welche davon genutzt wird, hängt z.T. von den persönlichen Vorlieben, von der Ziel-JRE, oder den angebotenen Methoden ab.

Auf das Wesentliche reduziert

URL url = new URL("http://www.byte-welt.net");
Scanner scanner = new Scanner(new InputStreamReader(url.openStream()));

Damit ist ein Stream zur Index-Seite von Byte-Welt geöffnet, aus dem wir nun den Textinhalt der Webseite (also HTML-Text, nicht der PHP-Code) lesen können.

JTextArea ta = new JTextArea();
while(scanner.hasNextLine()) {
   ta.append(scanner.nextLine()+"\n\r");
}

add(new JScrollPane(ta);

In diesem Beispiel würden wir den ausgelesenen Quelltext in einer JTextArea ausgeben.

Ein Beispiel-Programm

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.util.*;
import javax.swing.*;

public class GrapHtmlDemo {
   private JTextField targetField;
   private JTextArea tArea;
   private JTabbedPane tabbedPane;

   public GrapHtmlDemo(String title) {
      JPanel panel = new JPanel(new BorderLayout());
      targetField = new JTextField();
      targetField.addActionListener(new TargetFieldAction());
      tabbedPane = new JTabbedPane();
      tabbedPane.setTabPlacement(JTabbedPane.BOTTOM);
      tArea = new JTextArea();
      tabbedPane.addTab("Content", new JScrollPane(tArea));

      panel.add(targetField, BorderLayout.NORTH);
      panel.add(tabbedPane, BorderLayout.CENTER);

      JFrame frame = new JFrame(title);
      Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
      frame.setSize(dim.width * 66 / 100, dim.height * 66 / 100);
      frame.setLocationRelativeTo(null);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.add(panel);
      frame.setVisible(true);
   }

   private void readContent(URL url) throws Exception {
      Scanner scan = new Scanner(url.openStream());
      if (scan != null) {
         while(scan.hasNextLine()) {
            tArea.append(scan.nextLine()+"\n\r");
         }
      }
   }

   public static void main(String[] args) {
      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      }
      catch(Exception e) {
         System.err.println(e);
      }

      SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
            new GrapHtmlDemo("HTML-Code von Webseiten");
         }
      });
   }

   class TargetFieldAction extends AbstractAction {
      @Override
      public void actionPerformed(ActionEvent e) {
         if(tabbedPane.getTabCount() > 1) {
            tabbedPane.remove(1);
         }
         String urlString = targetField.getText().trim();
         try {
            readContent(new URL(urlString));
         }
         catch(Exception ex) {
            JTextArea eArea = new JTextArea(ex.toString());
            eArea.setBackground(Color.PINK);
            tabbedPane.addTab("Error", new JScrollPane(eArea));
            tabbedPane.setSelectedIndex(1);
         }
      }
   }
}