Input/Output URL Quellcode auslesen, speichern, weiterverarbeiten

JavaRatte

Mitglied
Hallo zusammen,

ich rätsel schon seit einiger Zeit an folgender Aufgabenstellung herum.

Und zwar möchte ich den Quellcode einer HTML-Webseite auslesen (das klappt soweit), den Quellcode nun unter dem Namen der URL auf meiner Festplatte speichern; anschließend dieses Dokument wieder einlesen und bestimmte Zeichen (/d) - also nur alle enthaltenen Ziffern - in der Console ausgeben lassen.

Ich bin mittlerweile soweit, dass ich den Quellcode in der Console ausgeben lassen kann.

Meine Fragen:

- Wie kann ich den Inhalt des Objektes nun auf meiner Festplatte in einen bestimmten Ordner speichern?
- Wie kann ich diese Datei dann wieder aufrufen, um anschließend bestimmte Zeichen herauszufiltern (Regex /d) ?


Java:
package io;

import java.io.*;
import java.net.*;

public class GetURL {

	public static void main(String[] args) throws IOException {

		URL u;
		InputStream is = null;
		DataInputStream dis;
		String s;

		u = new URL("http://www.spiegel.de/panorama/leute/");
		is = u.openStream();
		dis = new DataInputStream(new BufferedInputStream(is));

		while ((s = dis.readLine()) != null) {
			System.out.println(s);
		}

	}
}


Ich freue mich auf eure Tipps, Tricks und Hilfe. ;-)
Herzlichen Dank!
 

The_S

Top Contributor
Mit einem (Buffered)FileWriter die Datei schreiben und mit einem (Buffered)FileReader die Datei wieder auslesen. Oder direkt das komplette byte-Array über einen FileOutputStream schreiben und über einen FileInputStream wieder einlesen.
 

JavaRatte

Mitglied
Danke für die Tipps! Das klingt schonmal sehr vielversprechend.

Wie würde denn solch eine Vorgehensweise mit Regulären Ausdrücken aussehen? Also praktisch in Form des Java-Codes...
(Angenommen mir liegt nun der Quellcode einer Webseite vor. Wie kann ich den mit dem FileReader ausgelesenen Inhalt weiterverarbeiten, z.B. nur die Zeichen anzeigen lassen?)
 

JavaRatte

Mitglied
Inzwischen habe ich mich weiterhin mit dem Einlesen von URLs und Regex beschäftigt.

Jetzt fehlt mir nur noch der passende Regex Ausdruck.

Mein bisheriger Code:

Java:
package regex;

import java.net.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.io.*;

public class HtmlEinlesenRegex {

	public static CharSequence getURLContent(URL url) throws IOException {
		URLConnection conn = url.openConnection();
		String encoding = conn.getContentEncoding();
		if (encoding == null) {
			encoding = "ISO-8859-1";
		}
		BufferedReader br = new BufferedReader(new InputStreamReader(
				conn.getInputStream(), encoding));
		StringBuilder sb = new StringBuilder(16384);
		try {
			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line);
				sb.append('\n');
			}
		} finally {
			br.close();
		}
		return sb;
	}

	public static void main(String[] args) throws IOException {

		String expr = "<a href=(.*?)</a>"; 

		Pattern patt = Pattern.compile(expr, Pattern.DOTALL
				| Pattern.UNIX_LINES);

		URL url = new URL("http://www.spiegel.de/panorama/leute/");

	//	HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
	//	httpcon.addRequestProperty("User-Agent", "Mozilla/4.76");

		Matcher m = patt.matcher(getURLContent(url));
		while (m.find()) {
			String titelURL = m.group(1);
			System.out.println(titelURL);
		}

	}

}


Ich möchte aber nun zuerst den Link-Titel ausgeben und danach den entsprechenden Link zum Titel.

Wie kann ich das als Regex umsetzen? Wie geht das mit den Gruppen?

Am besten wäre eine Ausgabe in Form von: System.out.println(titelURL + ", " + adresseURL); // adresseURL => der eigentliche Link
 
Zuletzt bearbeitet:

The_S

Top Contributor
und bestimmte Zeichen (/d) - also nur alle enthaltenen Ziffern - in der Console ausgeben lassen.

Ich möchte aber nun zuerst den Link-Titel ausgeben und danach den entsprechenden Link zum Titel.

Wie kann ich das als Regex umsetzen? Wie geht das mit den Gruppen?

Am besten wäre eine Ausgabe in Form von: System.out.println(titelURL + ", " + adresseURL); // adresseURL => der eigentliche Link

Was möchtest du jetzt? Ziffern oder irgendwelche Titel und Adressen (was für welche)?
 

JavaRatte

Mitglied
Was möchtest du jetzt? Ziffern oder irgendwelche Titel und Adressen (was für welche)?

Also anfangs dachte ich, das Regex-Problem dürfte sehr einfach zu lösen sein. Deswegen meinte ich einfach nur "Ziffern"...
Jetzt wo es etwas konkreter wird, treten auch mehr Probleme auf.

Letztendlich möchte ich aus einer beliebigen Website den Quellcode auslesen, und alle dort enthaltenen Linktitel sowie die Links (also alles was zwischen <a href="..."> und </a> steht) in einen bestimmten Ordner auf meinem Rechner speichern. (Am besten in eine Textdatei in Form von: "Linktitel1, Link-URL1; Linktitel2, LinkURL2; ...)

Daher kam mein Ansatz, dass ich zuerst den Quellcode ausgeben lassen müsste, und danach mit Regulären Ausdrücken innerhalb des ausgegebenen Quellcodes nur bestimmte "Zeichen" anzeigen lassen wollte.
 

The_S

Top Contributor
Tjoa, reguläre Ausdrücke können kompliziert sein ;) . Hier schon mal ein kleiner Ansatz

<a ([^>]*)>([^<]*)</a>

Mit der ersten Klammer bekommst du das, was zwischen <a und > steht, und mit der zweiten Klammer den Text des a-Tags. Ich denke damit wirst du erstmal arbeiten können ...
 

JavaRatte

Mitglied
Super, das hat mir jetzt schon enorm geholfen!!

Bei bspw. Webseiten von Wikipedia, Spiegel etc. funktioniert das super.

Aber bei anderen Webseiten kommt folgende Fehlermeldung:

Java:
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: [url=http://www.google.de/search?q=BMW]BMW - Google-Suche[/url]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
(...)

Ich verstehe das so, dass der Fehler 403 beim Abrufen der URL auftritt.
403 ist doch ein ungültiger bzw. verbotener Aufruf.
Auch mit dem "Fake UserAgent" (siehe die auskommentierten Bereiche im obigen SourceCode) funktioniert es nicht.

Wie kann man dies umgehen?
 

JavaRatte

Mitglied
Nachtrag: Diese Fehlermeldung kommt nicht nur bei Google. (Ich weiß, dass Google bestimmte Algorithmen nutzt, um Spamming etc. vorzubeugen... Das ist auch gar nicht Sinn meines Java-Codes.)
 

The_S

Top Contributor
Ja, 403 ist forbidden. Wikipedia schreibt hierzu

403 Forbidden
Die Anfrage wurde mangels Berechtigung des Clients nicht durchgeführt. Diese Entscheidung wurde – anders als im Fall des Statuscodes 401 – unabhängig von Authentifizierungsinformationen getroffen, auch etwa wenn eine als HTTPS konfigurierte URL nur mit HTTP aufgerufen wurde.

Die Googlesuche ist bspw. mit HTTPS, du versuchst sie aber mit HTTP aufzurufen.
 

JavaRatte

Mitglied
Ah okay. :) Danke!

Ich konnte es jetzt umgehen mit:

Java:
public static CharSequence getURLContent(URL url) throws IOException {
		HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
		httpcon.addRequestProperty("User-Agent", "Mozilla/4.76");
		BufferedReader br = new BufferedReader(new InputStreamReader(
				httpcon.getInputStream()));

		StringBuilder sb = new StringBuilder(16384);
		try {
			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line);
				sb.append('\n');
			}
		} finally {
			br.close();
		}
		return sb;
	}

(... main ...)
 

Neue Themen


Oben