Java Ein Bild von einer Internetseite speichern.

ShaleX

Lt. Commander
🎅Rätsel-Elite ’25
Registriert
Mai 2009
Beiträge
1.715
Seas,

und zwar versuche ich das erste img Tag zu filtern und das darin enthaltente Bild zu speichern. Das funktioniert auch solange der src Anteil des <img> tags mit http:// anfaengt. Wenn es das jedoch nicht tut bekomme ich Fehlermeldungen
Code:
Exception in thread "main" java.net.MalformedURLException: no protocol:
at java.net.URL.<init>(Unknown Source)

jedoch versuche ich seit einiger Zeit herauszufinden warum und vllt kann mir ja hier jemand helfen ob ich etwas massgebliches uebersehe?!

Wenn ich versuche das http: mit
Code:
if(!parts[i].startsWith("http:"))parts[i]+="http:";
anzufuegen (nach while(!parts.contains("src"))i++; )kommt die Fehlermeldung File not Found (wegen der Exception)

Code:
Code:
try {
			File file = new File ("Seiten.txt");
			Scanner scanner = new Scanner (file);
			String url;
			int counter = 0;
				while(scanner.hasNext()) 
					{   
						url=scanner.nextLine();
						URL page = new URL(url);
						URLConnection yc = page.openConnection();
				           BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
				           String inputLine = in.readLine();
				           while (!inputLine.toLowerCase().contains("img"))inputLine = in.readLine();
				           in.close();
				           String[] parts = inputLine.split(" ");
				           int i=0;
				           while(!parts[i].contains("src"))i++;
					       String destinationFile = "image"+(counter++)+".jpg";
					       saveImage(parts[i].substring(5,parts[i].length()-1), destinationFile);
				           String tmp=scanner.nextLine();
				           
					}
			scanner.close();
		}
				catch (FileNotFoundException e) 
				{
					System.out.println ("File not found!");
					System.exit (0);
				}
	
	}

	public static void saveImage(String imageUrl, String destinationFile) throws IOException {
		// TODO Auto-generated method stub
		URL url = new URL(imageUrl);
		InputStream is = url.openStream();
		OutputStream os = new FileOutputStream(destinationFile);

		byte[] b = new byte[2048];
		int length;

		while ((length = is.read(b)) != -1) {
			os.write(b, 0, length);
		}

		is.close();
		os.close();
	}
	
}

Wuerde mich ueber jegliche Hinweise freuen.

Vielen Dank
 
Bilder, die sich im gleichen Verzeichnis befinden, wie z.B. die index.html können auch via src="bild.jpg" eingebunden sein. Damit man bild.jpg herunterladen kann, braucht man aber die komplette url. Das kann man sich z.B. aus der url zusammenbauen, die man aktuell scannen läßt.
 
Ich hab mir jetzt den großen Codeblock nicht angesehen, aber du hängst das http: an das Ende des Strings und nicht an den Anfang.

Code:
parts[i] += "http:"
entspricht
parts[i] = parts[i] + "http:"
und nicht
parts[i] = "http:" + parts[i]
aber ich denke das ist dir eigentlich klar. Manchmal sieht man den Wald vor Bäumen nicht.
Relative Pfade wie von sasdensas angesprochen sind auch nochmal ne Sache für sich.
 
Zuletzt bearbeitet:
Freezedevil schrieb:
Ich hab mir jetzt den großen Codeblock nicht angesehen, aber du hängst das http: an das Ende des Strings und nicht an den Anfang.

aber ich denke das ist dir eigentlich klar. Manchmal sieht man den Wald vor Bäumen nicht.
Relative Pfade wie von sasdensas angesprochen sind auch nochmal ne Sache für sich.

Tatsache, habe ich es glatt umgedreht. Jedoch komme ich dann immer noch in die Exception.
Da ich es gerne Universell haette, sprich egal welche internet seiten (die hauptseite keine direct links zu den images) ich in die Seiten.txt eingebe, er mir das Bild rausholt, werde ich ebenfalls andere Szenarien betrachten muessen....

Danke fuer die schnellen Antworten
 
Lass dir am besten ausgeben welche URL du anfragst. Jedes Mal wenn was schief geht siehst du vermutlich dann ziemlich schnell warum.
Also einfach ein try catch und bei ner Exception die entsprechende Variable ausgeben.
In diesem Fall vermute ich, dass es nicht geht weil du "http://" hinzufügen müsstest. Bei relativen Pfaden schlägt das natürlich trotzdem fehl.
 
Lass dir halt den Pfad nach der String-Modifikation mal ausgeben, bzw. debugge dein Programm.

Was du gerade tust ist raten, nicht programmieren :D
 
Zurück
Oben