# Auswerten von Strömen (zugestreamte HTML-Quelltexte auswerten)



## metacortex (5. Juli 2004)

Hallo, ich habe folgendes Problem:

Ich lasse mir ein HTML-Dokument zuschicken (funktioniert auch)


```
URL url = new URL("http://www.cool.de/);
InputStream in_html = url.openStream();
OutputStream out_html = System.out;
byte[] buffer = new byte[4096];
int bytes_read;

while((bytes_read = in_html.read(buffer)) != -1) {
  out_html.write(buffer, 0, bytes_read); // Stream zeilenweise anzeigen
  }
```


und möchte im eintreffenden Stream verschiedene Angaben rausfiltern. D.h. ich möchte beispielweise alle Zeilen haben, wo <table><tr><td>ich bin cool</td></tr></table> (nur als Beispiel) drinsteht bzw die mit <img width=" anfangen. Weiterhin möchte ich dann bei den rausgefilterten Zeilen, dann konkrete Angaben, z.b. das cool von "ich bin cool" (siehe Beispiel von oben) oder die width-Zahl bei img in entsprechenden Dateien speichern.

Irgendwie geht das mit reg-expressions!?


----------



## Thomas Darimont (5. Juli 2004)

Hallo!

Schau mal hier:


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * Created on 05.07.2004
 *
 * TODO 
 */

/**
 * @author Administrator TODO Describe what the class is used for
 */
public class FilterStreamDemo {

    //Alle Bilder einer html Seite auslesen.
    public final static String REGEX_IMG = ".*<img src=\"(.*(gif|jpg|png|jpeg)).*>.*";

    public final static Pattern PATTERN_IMG = Pattern.compile(REGEX_IMG);

    //Nach allen Zeilen suchen die den Begriff tutorials.de enthalten
    public final static String REGEX_TEXT = ".*tutorials.de.*";

    public final static Pattern PATTERN_TEXT = Pattern.compile(REGEX_TEXT);

    public static void main(String[] args) {
        try {

            URLConnection con = new URL("http://www.tutorials.de")
                    .openConnection();

            BufferedReader br = new BufferedReader(new InputStreamReader(con
                    .getInputStream()));

            String line;

            while ((line = br.readLine()) != null) {

                doFilterImages(line);
                //doFilterText(line);
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * @param line
     *            TODO Describe what the Method does
     */
    private static void doFilterText(String line) {
        Matcher matcher = PATTERN_TEXT.matcher(line);
        if (matcher.matches())
            System.out.println("Filtertext: " + line);
    }

    /**
     * @param line
     *            TODO Describe what the Method does
     */
    private static void doFilterImages(String line) {
        Matcher matcher = PATTERN_IMG.matcher(line);
        if (matcher.matches())
            System.out.println("FilterImage: " + matcher.group(1));

    }
}
```

Gruß Tom


----------



## metacortex (5. Juli 2004)

Okay, 
ich blick da mit den RegExpressions noch nicht so ganz durch.

ich habe mal eine html-Datei angehängt (habe mal deren Dateiendung in txt geändert), deren Quelltext ausgewertet werden soll.
Ich suche in dem Quelltext nach wkn, name, Boese (Handelspatz) und aktuellem Kurs.

Diese Angaben stehen auch alle in der html-Datei und sind auch im mit meiner (siehe oben) erstellten Methode im gelieferten Stream (der Stream der bei mir von der Seite ankommt) enthalten. Die Frage ist nun, wie bekomme ich diese 4 Werte in einzelne Variablen, damit ich später damit etwas bewerkstelligen kann!?


----------



## Thomas Darimont (5. Juli 2004)

Hallo!

Welche Ausgabe erwartest du denn von dieser Seite?
Deine Angaben sind nicht so klar, mach mal bitte ein Beispiel.

Gruß Tom


----------



## metacortex (5. Juli 2004)

Also ich möchte 4 Variablen (jeweils Typ STRING) haben, die gefüllt werden mit 

Wertpapierkennnummer ->  72
Name -> steht in Zeile 81 (oder auch Zeile 73)
Boerse -> steht in Zeile 145
Aktueller Kurs -> steht in Zeile 200

(hierbei beziehe ich mich auf die oben angehängte Datei)

Da ich jeweils eine Anfrage an einen Server stelle, der mir eine Datei wie die angehängte zurückliefert (wobei die angaben immer an der gleichen Stelle zu finden sind) möchte ich die html-Datei auslesen und dann diese 4 Werte als Variablen abspeichern um sie dann später weiterzuverwenden...

Jetzt verständlicher meine Problematik


----------



## Thomas Darimont (5. Juli 2004)

Hallo!

Siehe:


```
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * Created on 05.07.2004
 *
 * TODO 
 */

/**
 * @author Administrator TODO Describe what the class is used for
 */
public class FilterStreamDemo {

    public final static String REGEX_MARKET = ".*<input type=\"hidden\" name=\"market\" value=\"(.*)\">.*";

    public final static Pattern PATTERN_MARKET = Pattern.compile(REGEX_MARKET);

    public final static String REGEX_WKN = ".*<input type=\"hidden\" name=\"wkn\" value=\"(.*)\">.*";

    public final static Pattern PATTERN_WKN = Pattern.compile(REGEX_WKN);

    public final static String REGEX_NAME = ".*<input type=\"hidden\" name=\"name\" value=\"(.*)\"-->.*";

    public final static Pattern PATTERN_NAME = Pattern.compile(REGEX_NAME);

    public final static String REGEX_EXCHANGE = ".*<option value=\"DBK.ETR\" selected>(.*)</option>.*";

    public final static Pattern PATTERN_EXCHANGE = Pattern
            .compile(REGEX_EXCHANGE);

    public final static String CURRENT_PRICE = "Aktueller Kurs";

    public static void main(String[] args) {
        try {

            BufferedReader br = new BufferedReader(new FileReader(
                    "c:/wkn514000.html"));

            String line;

            while ((line = br.readLine()) != null) {
                doFilterMarket(line);
                doFilterWKN(line);
                doFilterName(line);
                doFilterExchange(line);
                if (checkForLatestPrice(line)) {
                    br.readLine();
                    br.readLine();
                    br.readLine();
                    br.readLine();
                    System.out.println(br.readLine().trim());

                }

            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * @param line
     *            TODO Describe what the Method does
     */
    private static void doFilterExchange(String line) {
        Matcher matcher = PATTERN_EXCHANGE.matcher(line);
        if (matcher.matches())
            System.out.println(matcher.group(1));
    }

    /**
     * @param line
     *            TODO Describe what the Method does
     */
    private static void doFilterName(String line) {
        Matcher matcher = PATTERN_NAME.matcher(line);
        if (matcher.matches())
            System.out.println(matcher.group(1));

    }

    /**
     * @param line
     *            TODO Describe what the Method does
     */
    private static void doFilterWKN(String line) {
        Matcher matcher = PATTERN_WKN.matcher(line);
        if (matcher.matches())
            System.out.println(matcher.group(1));

    }

    /**
     * @param line
     *            TODO Describe what the Method does
     */
    private static void doFilterMarket(String line) {
        Matcher matcher = PATTERN_MARKET.matcher(line);
        if (matcher.matches())
            System.out.println(matcher.group(1));

    }

    /**
     * @param line
     *            TODO Describe what the Method does
     */
    private static boolean checkForLatestPrice(String line) {
        if (line.indexOf(CURRENT_PRICE) >= 0) {
            return true;
        }
        return false;
    }

}
```

...sehr sehr sehr dirty und lahm aber es funktioniert ... ;-)

Ausgabe:


> DBK.ETR
> 514000
> DEUTSCHE BANK AG NAMENS-AKTIEN O.N.
> XETRA
> 63,00



Das ganze in 4 Stringvariablen reinzunudeln wirst du auch noch hinbekommen ...

Gruß Tom


----------

