Kryptische Zeichen beim Auslesen einer Website

Ganondorf

Mitglied
Hallo Leute

Ich habe Probleme eine Webseite auszulesen. Ich benutze denselben Codeschnipsel bei vielen Seiten und bei den meisten klappt er auch, aber bei einigen kommen nur komische Zeichen raus.

Mein Code:
Java:
URL url = new URL("http://anidb.net/perl-bin/animedb.pl?show=main");
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
System.out.println(reader.readLine());

Das Ergebnis lässt sich hier nicht reinkopieren. Ich hoffe jemand kann mir helfen.

Mfg Ganondorf
 
G

Gast2

Gast
Dann werden die Seiten wohl einen nicht UFT8/16 kompatiblen Zeichensatz verweden. Gibt doch mal die URL zu einer Seite die funktioniert und eine die nicht funktioniert.
 
G

Gast2

Gast
Du kannst den charset auslesen über den header, aber der BufferReader kann nur UTF8/16

Java:
		URLConnection uc = url.openConnection();

		for (String key : uc.getHeaderFields().keySet()) {
                       // print all header fields
			System.out.println(uc.getHeaderFields().get(key));
		}
		String charset = uc.getContentType().split("charset=")[1];
		InputStreamReader input = new InputStreamReader(uc.getInputStream(),
				charset);
		StringBuilder buffer = new StringBuilder();
		int c;
		while ((c = input.read()) != -1) {
			buffer.append((char) c);
		}
		String str = buffer.toString();
		String[] zeilen = str.split("\n"); // oder \r\n je nach EOL Style
		for (String s : zeilen) {
			System.out.println(s);
		}
	}

Wenn du es somachst kannst du aber auch gleich der UrlConnection einen ContentTypeHandler geben.

Zu deiner Beispielseite - die spezifiziert sich selber als UTF8, aber was da rüber kommt ist es meiner Ansicht nach nicht ;)
 

Ganondorf

Mitglied
Kann man irgendwie herausfinden, welches Charset die Webseite benutzt, ohne den Header zu benutzen? Da würde mir auch irgendein externes Programm reichen.
 
G

Gast2

Gast
Nein, du kannst dann nur Bytepattern raten ;)

Hmm, ich denke das es bei der Seite nicht geht liegt daran das das PERL skript auf dem server nur Stuß sended wenn man nicht einen ordentlichen HTTP Request macht.

Du solltest dir evtl mal den HTTPClient ansehn:
HttpClient - HttpClient Tutorial
 

Ganondorf

Mitglied
Ich habs mit dem HttpClient versucht krieg da aber nix hin, egal welches Beispiel ich ausprobiere. Entweder er findet irgendeine Klasse nicht, oder wirft eine Exception. Ich habs jetzt mal mit Version 3.1 versucht aber, der findet immer die LogFactory nicht. Hast du irgendein funktionierendes Beispiel?
 
G

Gast2

Gast
Wahahaha - jetzt fällt es mir wie Schuppen vor den Augen.

Die Seite schickt den Content gezippt...

Java:
    String url = "http://anidb.net/perl-bin/animedb.pl?show=main";
	HttpClient httpclient = new DefaultHttpClient();
	HttpGet httpget = new HttpGet(url);
	HttpResponse response = httpclient.execute(httpget);
    for (Header h : response.getAllHeaders()){
    	System.err.println(h.getName() +" = "+h.getValue());
    }

Date = Thu, 25 Feb 2010 20:13:48 GMT
Server = Apache
Cache-control = no-cache
Pragma = no-cache
Content-Type = text/html; charset=UTF-8
Expires = Thu, 25 Feb 2010 20:13:48 GMT
Set-Cookie = adbuin=1267128828-qsjM; path=/; expires=Sun, 23-Feb-2020 20:13:48 GMT
Vary = Accept-Encoding
Content-Encoding = gzip
Keep-Alive = timeout=4, max=50
Connection = Keep-Alive
Transfer-Encoding = chunked

:D

Da hilft dir dann soetwas:
Java:
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.GZIPInputStream;

import org.apache.http.Header;
import org.apache.http.HeaderElement;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.HttpEntityWrapper;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;

public class ClientGZipContentCompression {

    public final static void main(String[] args) throws Exception {
        DefaultHttpClient httpclient = new DefaultHttpClient();

        httpclient.addRequestInterceptor(new HttpRequestInterceptor() {
           
            public void process(
                    final HttpRequest request, 
                    final HttpContext context) throws HttpException, IOException {
                if (!request.containsHeader("Accept-Encoding")) {
                    request.addHeader("Accept-Encoding", "gzip");
                }
            }

        });
        
        httpclient.addResponseInterceptor(new HttpResponseInterceptor() {
           
            public void process(
                    final HttpResponse response, 
                    final HttpContext context) throws HttpException, IOException {
                HttpEntity entity = response.getEntity();
                Header ceheader = entity.getContentEncoding();
                if (ceheader != null) {
                    HeaderElement[] codecs = ceheader.getElements();
                    for (int i = 0; i < codecs.length; i++) {
                        if (codecs[i].getName().equalsIgnoreCase("gzip")) {
                            response.setEntity(
                                    new GzipDecompressingEntity(response.getEntity())); 
                            return;
                        }
                    }
                }
            }
            
        });
        
        HttpGet httpget = new HttpGet("http://anidb.net/perl-bin/animedb.pl?show=main"); 
        
        // Execute HTTP request
        System.out.println("executing request " + httpget.getURI());
        HttpResponse response = httpclient.execute(httpget);

        System.out.println("----------------------------------------");
        System.out.println(response.getStatusLine());
        System.out.println(response.getLastHeader("Content-Encoding"));
        System.out.println(response.getLastHeader("Content-Length"));
        System.out.println("----------------------------------------");

        HttpEntity entity = response.getEntity();
        
        if (entity != null) {
            String content = EntityUtils.toString(entity);
            System.out.println(content);
            System.out.println("----------------------------------------");
            System.out.println("Uncompressed size: "+content.length());
        }

        // When HttpClient instance is no longer needed, 
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();        
    }

    static class GzipDecompressingEntity extends HttpEntityWrapper {

        public GzipDecompressingEntity(final HttpEntity entity) {
            super(entity);
        }
    
        @Override
        public InputStream getContent()
            throws IOException, IllegalStateException {

            // the wrapped entity's getContent() decides about repeatability
            InputStream wrappedin = wrappedEntity.getContent();

            return new GZIPInputStream(wrappedin);
        }

        @Override
        public long getContentLength() {
            // length of ungzipped content is not known
            return -1;
        }

    } 
    
}

Du musst als libs haben:

commons-logging-1.1.1
httpclient-4.0.1
httpmime-4.0.1
httpcore-4.0.1

Kannst auch versuchen den einfach auf den ganz naiven Weg wie in deinem ersten Posting den Content zu holen und dann zu entpacken:
Java:
	  public static String unzipStringFromBytes( byte[] bytes ) throws IOException
	  {
	    ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
	    BufferedInputStream bufis = new BufferedInputStream(new GZIPInputStream(bis));
	    ByteArrayOutputStream bos = new ByteArrayOutputStream();
	    byte[] buf = new byte[1024];
	    int len;
	    while( (len = bufis.read(buf)) > 0 )
	    {
	      bos.write(buf, 0, len);
	    }
	    String retval = bos.toString();
	    bis.close();
	    bufis.close();
	    bos.close();
	    return retval;
	  }
 
Zuletzt bearbeitet von einem Moderator:

Ganondorf

Mitglied
Super, die erste Methode funktioniert. Aber womit genau müsste ich die zweite Methode füttern? Ist das die Ausgabe des InputStreamReaders als Byte-Array, oder was?
 

Ganondorf

Mitglied
@Hoax:
Was sollte der Kommentar?

@fassy:
Wie komme ich genau von einer Webadresse denn am besten an dieses byte-Array?

Und noch was zu der ersten Methode, wenn ich eine "Corrupt GZIP trailer"-Exception krieg, liegt das an der Webseite oder am Programm?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Umlaute wie ê in sms werden als ? zeichen dargestellt Netzwerkprogrammierung 4
K Socket Nur bestimmte Zeichen als Kommunikation zulassen Netzwerkprogrammierung 1
F Socket Komische Zeichen Netzwerkprogrammierung 7
A Socket ASCii Zeichen werden nicht per udp übermittelt. please help . Netzwerkprogrammierung 6
W Zeichen von Client an Server schicken Netzwerkprogrammierung 5
A InputStream ließt nur 65536 Zeichen anstatt ganzer Puffer Netzwerkprogrammierung 8
G unbekannte Zeichen beim senden und lesen Netzwerkprogrammierung 2
I Email mit kyrillischen Zeichen in der Betreffzeile Netzwerkprogrammierung 7
OnDemand Json Objekt leeres Array beim lesen Netzwerkprogrammierung 9
T Brauche Hilfe beim GET-String für HttpURLConnection Netzwerkprogrammierung 4
A sporadischer Fehler beim Schreiben auf NAS Netzwerkprogrammierung 2
A Automatisches Update beim Starten Netzwerkprogrammierung 1
J Hilfe beim programmiern einer App zur Anmeldung im Wlan-Netzwerk Netzwerkprogrammierung 0
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
M Nur die erste Nachricht kommt beim Server an Netzwerkprogrammierung 11
M jsf-seite beim hinzufügen einer csv-datei in einen ordner aktualiseren Netzwerkprogrammierung 0
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
A Probleme beim Klassen-Import von sun.misc. ... Netzwerkprogrammierung 19
B Probleme beim ersten Netzwerkprogramm Netzwerkprogrammierung 3
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
Z Socket Probleme beim Senden und Empfangen Netzwerkprogrammierung 5
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
Z Probleme beim Senden von Nachrichten an den Server Netzwerkprogrammierung 9
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
C ObjectInputReader wirft beim zweiten Aufruf eine Exception Netzwerkprogrammierung 3
Y RMI Initialisierung beim Server Netzwerkprogrammierung 10
B Socket Aufhängen beim Lesen Netzwerkprogrammierung 4
C Socket Probleme beim Lesen und Schreiben aus/in einen Socket Netzwerkprogrammierung 2
M Problem beim Datenempfang Netzwerkprogrammierung 2
DEvent Keine IOException beim schreiben Socket Netzwerkprogrammierung 3
M Authentifizierung beim Start von Java-Applets Netzwerkprogrammierung 2
N NIO Problem beim speziellen Behandeln von einzelnen Benutzern Netzwerkprogrammierung 13
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
T ServerSocket bleibt beim lesen von Input hängen Netzwerkprogrammierung 2
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
P Probleme beim weiter senden von Datein Netzwerkprogrammierung 10
S Threads beim Server koordinieren Netzwerkprogrammierung 5
K TrafficClass eines UDP Pakets kommt beim Empfänger nicht an Netzwerkprogrammierung 5
T Pfadangabe beim kopieren übers Netzwerk Netzwerkprogrammierung 5
Q NullPointExeption beim Versuch byte[] zu senden/writen Netzwerkprogrammierung 3
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
G Blockieren beim Öffnen der In und Outputstreams Netzwerkprogrammierung 2
I Problem beim empfangen von Daten (Zahlen) Netzwerkprogrammierung 7
J Was bedeutet: Address already in use: connect (beim client?) Netzwerkprogrammierung 4
Rontu Problem beim Übertragen einer Datei Netzwerkprogrammierung 9
J Problem beim Senden von File Netzwerkprogrammierung 4
V Problem beim Senden von Dateien Netzwerkprogrammierung 4
P problem beim schließen eines Streams Netzwerkprogrammierung 6
J RMI Fehler beim Proxy Netzwerkprogrammierung 2
G Fehlermeldung beim Erzeugen der WSDL Datei unter Axis Netzwerkprogrammierung 2
C Session Problem beim Zugriff auf Webseiten Netzwerkprogrammierung 3
J while-Schleife / Abbruchbed. beim Einlesen eines Streams Netzwerkprogrammierung 4
M Fehlende Bits / Bytes beim kopieren Netzwerkprogrammierung 4
I Apache http-client: Problem beim Proxyaufruf Netzwerkprogrammierung 2
C RMI: Problem beim Aufruf einer Methode. Falsch gecastet? Netzwerkprogrammierung 8
T RMI - Probleme beim Starten des Clients Netzwerkprogrammierung 4
D Problem beim holen einer PHP-Seite via HttpClient Netzwerkprogrammierung 19
G ActionEvent klappt beim Chat nicht Netzwerkprogrammierung 5
megachucky RMI - AccessControlException beim Naming.lookup() Netzwerkprogrammierung 12
G Probleme mit Firewall beim empfangen von dateien über socket Netzwerkprogrammierung 6
J Problem beim versenden von eigenen Objekten über RMI Netzwerkprogrammierung 2
M sessionhandling beim webserver Netzwerkprogrammierung 5
D Bekomme Dummyspace beim Internetseiten auslesen Netzwerkprogrammierung 2
R Problem beim Senden von Emails (Javamail) Netzwerkprogrammierung 2
TRunKX Hilfe beim senden und empfangen Netzwerkprogrammierung 2
S Probleme beim Beschränken der Geschwindigkeit Netzwerkprogrammierung 6
M Probleme beim Abfangen von Streams Netzwerkprogrammierung 5
M problem beim schicken von XML-DAtenpacketen via TCP Netzwerkprogrammierung 3
D Performance Problem beim File senden, empfangen Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben