html seite auslesen

Status
Nicht offen für weitere Antworten.

Nao88

Bekanntes Mitglied
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:
 
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 :-/
 
mal für den anfang einfach lesen....

Code:
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...
 
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 :?:
 
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.
 
Stimmt 😳
so habe jetzt das so umgesetzt habe aber ein parr Fragen
Code:
	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;
	}

	}
 
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.
 
ich will s1 in einer späteren class auslesen geht ja denn nicht mehr
was ist der unterschied zwischen StringBuilder/StringBuffer
:bahnhof:
 
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...
 
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.
 
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
Code:
	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;
	}


	}
 
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
...
 
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....
 
also s1=line;
obwohl das geht ja nicht dan müsste ich null raus bekommen 😳
mhhh

noch eine frage
Code:
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
 
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.
 
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!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben