# html seite auslesen



## Nao88 (11. Feb 2009)

Hallo ich möchte eine html Seite auslesen und bestimmte Informationen raus lesen gibt es da ein Tutorium oder so 
danke 
oder besser gibt es da eine schon vorgegebene zeichenfolge  :lol:


----------



## SlaterB (11. Feb 2009)

gibt google


----------



## Kaffeemaschinist (11. Feb 2009)

Bedeutet dass, dass du aus dem _Quelltext_ lesen möchtest, oder "einfach" nur die HTML-Seite _anzeigen_ möchtest?

Für ersteres gibt es je nach Bedarf einfache String-Suchfunktionenbzw. Regular Expressions bzw. vielleicht sogar ein XML-Parser (falls es XHTML und well-formed ist). Für Letzteres gibt es bereits vielversprechende Projekte, die zwar nicht perfekt, aber einsatzfähig sind (einfach mal bei Google mit "XHTML +java +renderer" suchen und du wirst fündig).

Fertigen Code wird's da vermutlich bei beiden nicht geben :-/


----------



## ARadauer (11. Feb 2009)

mal für den anfang einfach lesen....


```
package main.java;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

public class WebReader {   
   public static void main(String[] args) throws IOException {
      URL url = new URL("http://localhost:8080/portal/index.html");      
      BufferedReader r = new BufferedReader(new InputStreamReader( url.openStream()));      
      String line = null;
      while((line=r.readLine())!=null)
         System.out.println(line);
   }

}
```

wie du genaue infos raus bekommst, kann ich dir am abend schicken... hab mal einen parser geschrieben der eine tabelle als String[][] zurück gibt... schreib mir eine pm, damit ich nicht drauf vergesse...


----------



## musiKk (11. Feb 2009)

Html-Parser gibts doch schon haufenweis. Z. B. htmlparser oder tagsoup oder andere.


----------



## Nao88 (11. Feb 2009)

Erst ma danke an alle für die Antworten und besonders @ ARadauer für das Programm 
so kann mir einer das prg erklären da ich ja hier was lernen will  :wink: 
denn ich habe da noch ne frage ich muss es halt in einem String speichern den ich nachehr weiter bearbeite um die richtigen Informationen raus  filtern  aber wo kann ich das sagen :?:


----------



## Kaffeemaschinist (12. Feb 2009)

Um das Programm zu verstehen, solltest du einfach mal nacheinander die jeweilig eingesetzten Klassen in der Java-API durchlesen, dann wird es fast schon selbst erklärend.

Um es in einem String zu speichern:
Warum nicht neben _line_ noch einen zweiten String erstellen, an den du nach und nach _line_ "dranklebst"? Das kann lediglich etwas inperformant werden (siehe später StringBuffer bzw. StringBuilder), aber das sollte für dich erstmal keine Rolle spielen.


----------



## Nao88 (12. Feb 2009)

Stimmt   
so habe jetzt das so umgesetzt habe aber ein parr Fragen 

```
import java.io.BufferedReader;
	import java.io.IOException;
	import java.io.InputStreamReader;
import java.net.URL;
public class Verarbeitung {
	static String s1=new String ();
	static String url=new String ();
	   public static void main(String[] args) throws IOException {
	      URL url = new URL("http://www.java-forum.org/de/");     
	      BufferedReader r = new BufferedReader(new InputStreamReader( url.openStream())); 
	      String line = null;
	      while((line=r.readLine())!=null)
	    	  s1 =line +s1;
	      System.out.println(line);// Warum wird hier jetzt null ausgegeben
	         System.out.println(s1);// und der html Text ist jetzt eine lange linie
	   }
	public static String getS1() {
		return s1;
	}
	public static void setS1(String s1) {
		Verarbeitung.s1 = s1;
	}

	}
```


----------



## Kaffeemaschinist (12. Feb 2009)

1. Frage: Wenn du die While-Schleife verlässt, ist _line==null_, daher die Ausgabe

_s1 = line + s1_ solltest du mal in der Funktionsweise überdenken. Könnte evtl. die Antwort auf Frage 2 sein.

Eher kleiner Schönheitsfehler: _static String s1=new String ();_
Strings werden ohne den new-Operator erstellt, meistens einfach nur zugewiesen, also eher: _static String s1="";_

Außerdem ist es etwas seltsam, dass du alles im statischen Kontext ausführst. Hat das einen besonderen Hintergrund?

Und mal noch im Netz nachschauen, warum man bei solchen Aktion mit s1 lieber StringBuilder/StringBuffer statt String nimmt.


----------



## Nao88 (12. Feb 2009)

ich will s1 in einer späteren class auslesen geht ja denn nicht mehr 
was ist der unterschied zwischen  StringBuilder/StringBuffer
 :bahnhof:


----------



## ARadauer (12. Feb 2009)

lernt ihr sowas in der schule? alles static machen, damit man von überall drauf zugreifen kann? das hat nix mit objektorientierung zu tun!

den member private machen und über getter und setter anderen klassen zugänglich machne, die das objekt instanzieren...

die main methode ist an dieser stelle sowieso falsch...


----------



## Kaffeemaschinist (12. Feb 2009)

Am besten du schaust dir mal ein paar Einführungsbeispiele zum Thema Objektorientierung an, Nao. Dort steht dann auch drin, wann man das Stichwort "static" nutzt, wie man Eigenschaften für andere Klassen zugänglich macht usw.
Siehe dazu auch die FAQ hier im Forum unter:
http://www.java-forum.org/de/viewtopic.php?t=9267

Der Unterschied versteckt sich ein wenig im Einführungstext: Prinzipiell leisten beide Klassen dasselbe, nur ist die eine durch Synchronisation "thread-safe" gemacht. Sowas macht eine Klasse u.U. zwar etwas inperformanter, aber auch sicherer, wenn du aus verschiedenen Threads gleichzeitig drauf zugreifst.

Da ich aber nicht glaube, dass du bisher mit Threads in Berührung kommen wirst, kannst du ruhig die _unsychronisierte_ Variante der beiden Klassen nutzen.


----------



## Nao88 (12. Feb 2009)

Jo das wurde uns gesagt :meld:  obwohl es eigentlich nicht intelligent ist man sollte sie ja vtl privat macht oder  ???
ich gebe aber zu Schluss wieder public da ich s1 später noch verarbeiten will 
aber wie mach ich das das es eins nicht in einer reihe ausgegeben wird 

```
import java.io.BufferedReader;
	import java.io.IOException;
	import java.io.InputStreamReader;
import java.net.URL;

public class Verarbeitung {
	private String s1=new String ();
	   public static void main(String[] args) throws IOException {
	      URL url = new URL("http://www.java-forum.org/de/");     
	      BufferedReader r = new BufferedReader(new InputStreamReader( url.openStream())); 
	      String line = null;
	      while((line=r.readLine())!=null)
	    	  s1 =line +s1;
	      System.out.println(line);// Warum wird hier jetzt null ausgegeben
	         System.out.println(s1);// und der html Text ist jetzt eine lange linie möchte aber die normale ausgabe brauche ich zum verarbeiten
	   }
	public String getS1() {
		return s1;
	}
	public void setS1(String s1) {
		this.s1 = s1;
	}


	}
```


----------



## Kaffeemaschinist (12. Feb 2009)

Ich vermute mal, das Programm lässt sich so nicht kompilieren.

Du hast eine Klasse "Verarbeitung", die, wenn sie instanziert wird, den Datenmember S1 mitbringt und den Zugriff auf S1 ermöglicht.

Dann hast du die statische Methode main, die aber "Verarbeitung" gar nicht instanziert und somit gar keine Sicht auf all das besitzt, was nicht statisch ist, speziell: s1, getS1(), setS1(String).

Lass dich nicht davon täuschen, wo main() steht, denn die Verschachtelung der Schreibweise hat keinen Einfluss auf die Funktionalität.

Wie gesagt: Am besten mal ein paar Einführungsbeispiele zu Objektorientierung in Java durchlesen, dann wird es relativ gut deutlich.


Und ja, s1 sollte privat deklariert sein, denn du hast ja einen getter und setter, um von "außen" drauf zuzugreifen.

Zur Frage 2: Zuerst einmal ist "s1 = line + s1" immer noch falsch (Reihenfolge beachten!), und dann vermute ich mal, dass _r.readLine()_ die Zeile ohne den abschließenden Zeilentrenner zurückgibt.
Also müsstest du den immer noch mit anfügen an s1.

Beispiel ... dein Text ist folgendermaßen aufgebaut:
line1 ZEILENTRENNER
line2 ZEILENTRENNER
line3 ZEILENTRENNER
line4 ZEILENTRENNER
...

von readLine bekommst du aber immer nur geliefert:
line1 
line2
line3
line4
...


----------



## Nao88 (12. Feb 2009)

wie soll ich denn sonst anordnen  :bahnhof:


----------



## Kaffeemaschinist (12. Feb 2009)

Ich vermute mal, da ist der Wald dem Baum im Wege, deswegen Bsp:

line = "Zeile 2"
s1 = "Zeile 1"
s1 =line +s1; 

---> s1 == "Zeile 2Zeile1"

Hmm....


----------



## Nao88 (12. Feb 2009)

also s1=line; 
obwohl das geht ja nicht dan müsste ich null raus bekommen  
mhhh

noch eine frage 

```
private String s1=new String ();
	   public static void main(String[] args) throws IOException {
	      URL url = new URL("http://www.java-forum.org/de/");     
	      BufferedReader r = new BufferedReader(new InputStreamReader( url.openStream())); 
	      String line = null;
	      while((line=r.readLine())!=null)
	    	  s1 =line ;
	      System.out.println(line);
	         System.out.println(s1);
```
habe s1 jetzt private gesetzt und jetzt werden mir die variablen s1 ab der while schleife nur private bedeutet ja das die class darauf zugreifen kann aber ist aber nicht so


----------



## Kaffeemaschinist (12. Feb 2009)

Wie gesagt: während du dich "public static void" befindest, befindest du dich nicht im Klassenkontext. Den erreichst du erst, wenn du von Verarbeitung eine Instanz erstellst und damit drauf zugreifst.

Verarbeitung v = new Verarbeitung();
v.getS1();
v.setS1("Hallo");

Jetzt wird's aber wirklich Zeit, dass du dir mal das Konzept von Klassen anschaust, denn so kommst du nicht weiter - wenn du doch schon mit Klassenkonstrukten und Sichtbarkeitsmodifikatoren arbeitest.


----------



## ARadauer (12. Feb 2009)

ich würd mich einfach mal mit den grundlagen beschäftigen...
wenn man dazu keine lust hat, ist die sache sehr müsam und es kommt nur scheiße raus...

wenn man sich die 1-2 tage zeit nimmt und die ersten 9 kaptiel von java ist auch eine insel ließt gibts nichts einfacheres als java!


----------



## Ebenius (12. Feb 2009)

ARadauer hat gesagt.:
			
		

> wenn man sich die 1-2 tage zeit nimmt und die ersten 9 kaptiel von java ist auch eine insel ließt gibts nichts einfacheres als java!


Stimmt. Zum Kochenlernen wär's echt das falsche Buch. :lol:


----------

