Pregunta

Estoy tratando de utilizar java.util.Scanner tomar contenidos de Wikipedia y utilizarla para búsquedas basadas en texto. El hecho es que todo está bien, pero al leer algunas palabras que me dan errores. Mirar el código y hacer algún tipo de control resultó que con algunas palabras parece no reconocer la codificación, más o menos, y el contenido no es más legible. Este es el código utilizado para tomar la página:

// -Start -

try {
        connection =  new URL("http://it.wikipedia.org
wiki/"+word).openConnection();
                    Scanner scanner = new Scanner(connection.getInputStream());
        scanner.useDelimiter("\\Z");
        content = scanner.next();
//          if(word.equals("pubblico"))
//              System.out.println(content);
        System.out.println("Doing: "+ word);
//End

El problema surge con las palabras como "pubblico" para la wikipedia italiana. el resultado de la println en Pubblico palabra es como esto (cortado): ï¿ï¿½] Ksr> � ~ E �1A���E�ER3tHZ�4v�� y PZjtc�¿½ï¿½D�7_ | ���� = 8��Ø}

¿Tiene usted alguna idea de por qué? Sin embargo, se miraron fuente de la página y las cabeceras son los mismos, con la misma codificación ...

Resultó que el contenido se gzipped, por lo que puedo decir que no me Wikipedia enviar teir páginas cremallera o Es la única manera? gracias

¿Fue útil?

Solución

Trate de usar un Reader en lugar de un InputStream - Creo que funciona algo como esto:

connection =  new URL("http://it.wikipedia.org/wiki/"+word).openConnection();
String ctype = connection.getContentType();
int csi = ctype.indexOf("charset=");
Scanner scanner;
if (csi > 0)
    scanner = new Scanner(new InputStreamReader(connection.getInputStream(), ctype.substring(csi + 8)));
else
    scanner = new Scanner(new InputStreamReader(connection.getInputStream()));
scanner.useDelimiter("\\Z");
content = scanner.next();
if(word.equals("pubblico"))
    System.out.println(content);
System.out.println("Doing: "+ word);

También puedes, simplemente pasar el juego de caracteres al constructor escáner directamente como se indica en otra respuesta.

Otros consejos

Trate de usar el escáner con un conjunto de caracteres especificado:

public Scanner(InputStream source, String charsetName)

Para el constructor por defecto:

  

bytes de la transmisión se convierten en caracteres utilizando juego de caracteres por defecto de la plataforma subyacente.

escáner en java.sun.com

Es necesario utilizar un URLConnection, por lo que se puede determinar el tipo de contenido cabecera en la respuesta. Esto debe decirle a la codificación de caracteres para utilizar cuando crear su Scanner .

Específicamente, mira el parámetro "charset" de la cabecera de tipo de contenido.


Para inhibir la compresión gzip, conjunto la cabecera aceptar que codifica a "identidad". Ver la especificación HTTP para obtener más información.

connection =  new URL("http://it.wikipedia.org/wiki/"+word).openConnection();
            connection.addRequestProperty("Accept-Encoding","");
            System.out.println(connection.getContentEncoding());
            Scanner scanner = new Scanner(new InputStreamReader(connection.getInputStream()));
            scanner.useDelimiter("\\Z");
            content = new String(scanner.next());

codificación no cambia. ¿Por qué?

connection =  new URL("http://it.wikipedia.org/wiki/"+word).openConnection();
//connection.addRequestProperty("Accept-Encoding","");
//System.out.println(connection.getContentEncoding());

InputStream resultingInputStream = null;       // Stream su cui fluisce la pagina scaricata
String encoding = connection.getContentEncoding();    // Codifica di invio (identity, gzip, inflate)
// Scelta dell'opportuno decompressore per leggere la sorgente
if (connection.getContentEncoding() != null && encoding.equals("gzip")) {
    resultingInputStream = new GZIPInputStream(connection.getInputStream());
}
else if (encoding != null && encoding.equals("deflate")) {
    resultingInputStream = new InflaterInputStream(connection.getInputStream(), new Inflater(true));
}
else {
    resultingInputStream = connection.getInputStream();
}

// Scanner per estrarre dallo stream la pagina per inserirla in una stringa
Scanner scanner = new Scanner(resultingInputStream);
scanner.useDelimiter("\\Z");
content = new String(scanner.next());

Así funciona !!!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top