# Mit Java eine HTML-Seite speichern



## Martin92 (10. Apr 2012)

Hallo,

ich will eine HTML-Seite aufrufen und diese speichern. Der genaue Link zu der Seite ist bekannt. Habt ihr irgendwelche Vorschläge, wie ich das am Besten machen kann?

Gruß
Martin


----------



## Camill (10. Apr 2012)

[JAPI]URL[/JAPI] und [JAPI]URLConnection[/JAPI] dürften da schon weiterhelfen.


----------



## Martin92 (15. Apr 2012)

Hallo,

danke für deine Antwort. Es klappt so. Nur jetzt habe ich ein anderes Problem: Ich kann den gesamten Quellcode der HTML-Seite nicht in einen String speichern. Ich brauche es um später mit regulären Ausdrücken etwas darin zu suchen.


```
URL myurl = new URL("http://www.google.de");
        URLConnection con = myurl.openConnection();
        Scanner scanner = new Scanner(myurl.openStream());
        
        
        String temp = "";
        while(scanner.hasNextLine()){
            temp.concat(scanner.nextLine());
        }
        
        System.out.println(temp);
```

Der String enthält keine Zeichen. Wo könnte der Fehler sein oder habe ich einen falschen Ansatz?


----------



## Marcinek (15. Apr 2012)

Strings sind unveränderlich.

temp.concat() gibt dir den konkatinierten String zurück.


----------



## Gast2 (15. Apr 2012)

Strings sind immutable. concat liefert einen neuen String zurück den du ignorierst. Nimm für sowas aber lieber nen StringBuilder.


----------



## Martin92 (15. Apr 2012)

Der enthält aber keine Zeichen. Darin liegt mein Problem.

[EDIT]ok, mache ich. deine antwort habe ich erst später gesehen.

danke, jetzt klappt es! [/EDIT]


----------



## GUI-Programmer (15. Apr 2012)

Nun die Fortsetzung. Auf dieser Art und Weise lässt sich zwar der gesamte Quellcode (HTML) einer Website auslesen, allerdings, wenn man diesen dann anzeigen lässt im Browser, sind die ganzen Bilder weg - warum? Daher meine Frage: Gibt es eine bessere Möglichkeit? Oder warum erscheinen manche Dinge aus einer .html Datei anders als in der echten Website?

Code:

```
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.File;

public class WebsiteSaver {
	public static void main(String[] args) throws Exception{
		if(args.length == 2) {
			URL url = new URL(args[0]);
			URLConnection con = url.openConnection();
			Scanner scanner = new Scanner(url.openStream());
			StringBuilder builder = new StringBuilder();
			while(scanner.hasNextLine()){
				builder.append(scanner.nextLine());
				builder.append(System.getProperty("line.separator"));
			}
			
			File file = new File(args[1]);
			file.createNewFile();
			BufferedWriter writer = new BufferedWriter(new FileWriter(file));
			writer.write(builder.toString());
			writer.flush();
			writer.close();
		}
	}
}
```

Test: 
	
	
	
	





```
java WebsiteSaver [noparse]http://www.java-forum.org/[/noparse] JavaForum.html
```


----------



## L-ectron-X (15. Apr 2012)

GUI-Programmer hat gesagt.:


> Daher meine Frage: Gibt es eine bessere Möglichkeit? Oder warum erscheinen manche Dinge aus einer .html Datei anders als in der echten Website?


Weil die URLs zu den Images in der Originalseite relativ notiert sind.
Wenn das Ganze auch bei dir lokal laufen soll. musst du die relative URL in absolute umwandeln, also noch das *[noparse]http://www.java-forum.org/[/noparse]* davor setzen.
Oder wenn du die Site rippen willst, auch die Images herunter laden und in gleichnamigen Verzeichnissen wie im Original ablegen.


----------



## GUI-Programmer (15. Apr 2012)

L-ectron-X hat gesagt.:


> Wenn das Ganze auch bei dir lokal laufen soll. musst du die relative URL in absolute umwandeln, also noch das Java programmieren aus Leidenschaft davor setzen.



OK, doch woher weis ich, bei welchen src = ich das machen muss, denn schließlich kann es ja auch vorkommen, das die Bilder von einer anderen Website herstammen???
[EDIT]
Oh, mir ist beim Schreiben gerade aufgefallen, dass ich prüfen könnte, ob es nach src mit http: bzw. https, etc. weiter geht.
[/EDIT]


----------



## L-ectron-X (15. Apr 2012)

Siehste! 
Geht mir auch oft so, dass ich beim "lauten" Nachdenken die Lösungen finde.


----------



## GUI-Programmer (15. Apr 2012)

So, hab jetzt schon eine Lösung:

```
import java.net.URL;
import java.util.Scanner;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.File;

public class WebsiteSaver {
	public static void main(String[] args) throws Exception{
		if(args.length == 2) {
			URL url = new URL(args[0]);
			url.openConnection();
			Scanner scanner = new Scanner(url.openStream());
			StringBuilder builder1 = new StringBuilder();
			while(scanner.hasNextLine()){
				builder1.append(scanner.nextLine());
				builder1.append(System.getProperty("line.separator"));
			}
			
			String text = builder1.toString();
			int index = -1;
			while((index = text.indexOf("src=", index+1)) != -1) {
				String value = text.substring(index+5, index+11);
				if(!value.contains("http:") && !value.contains("https:")) {
					StringBuilder builder2 = new StringBuilder();
					builder2.append(text.substring(0, index+5));
					builder2.append(args[0]);
					builder2.append(text.substring(index+5, text.length()-1));
					text = builder2.toString();
				}
			}
			
			
			File file = new File(args[1]);
			file.createNewFile();
			BufferedWriter writer = new BufferedWriter(new FileWriter(file));
			writer.write(text);
			writer.flush();
			writer.close();
		}
	}
}
```

Nun dazu noch eine Frage: Sollt ich noch nach etwas anderen außer "http" und "https" suchen? Bzw. gibts da noch was anderes???


----------



## GUI-Programmer (15. Apr 2012)

Ist wohl doch nicht so leicht, wie zuerst angenommen. Folgende Probleme gibt es noch zu lösen:

1. Dass sich die Pfade teilweise relativ zu "Haupt-Website" beziehen, und nicht zu der Page, von welchem man das Abbild möchte
2. Dass es unterschiedliche Art und Weisen gibt, wie man ein Bild relativ einbindet, sprich z.B einfach:

```
src="images/Testbild.jpg"
src="/image/Tesbild.jpg"
src="../Testbild.jpg"
```

Vielleicht kann ja hier jemand weiterhelfen und evtl. meinen Code etw. modifizieren.


----------

