java.util.Scanner и Wikipedia - PullRequest
       18

java.util.Scanner и Wikipedia

0 голосов
/ 12 февраля 2009

Я пытаюсь использовать java.util.Scanner, чтобы взять содержимое Википедии и использовать его для поиска по словам. Дело в том, что все нормально, но при чтении некоторых слов это выдает ошибки. Глядя на код и делая некоторые проверки, оказалось, что с некоторыми словами кажется не распознавать кодировку или около того, и контент больше не читается. Это код, используемый для перехода на страницу:

// -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

Проблема возникает со словами «pubblico» для итальянской википедии. результат println для слова pubblico выглядит следующим образом (вырезано): ï¿ï¿½] KSR> � ~ E �1A���E�ER3tHZ�4v�� & PZjtc�¿½ï¿½D�7_ | ���� = 8��Ø}

Ты хоть представляешь, почему? Все же посмотрел на исходный код страницы и заголовки одинаковые, с одинаковой кодировкой ...

Оказалось, что контент распакован, так что я могу сказать Википедии не посылать мне свои страницы в архиве, или это единственный способ? спасибо

Ответы [ 5 ]

2 голосов
/ 12 февраля 2009

Попробуйте использовать сканер с указанным набором символов:

public Scanner(InputStream source, String charsetName)

Для конструктора по умолчанию:

Байты из потока преобразуются в символы с использованием кодировки по умолчанию базовой платформы.

Сканер на java.sun.com

1 голос
/ 12 февраля 2009

Вам необходимо использовать URLConnection, чтобы вы могли определить заголовок типа содержимого в ответе. Это должно сказать вам кодировку, которую вы будете использовать, когда вы создаете Scanner.

В частности, посмотрите на параметр "charset" заголовка типа контента.


Чтобы запретить сжатие gzip, установите заголовок accept-encoding в значение «identity». См. спецификацию HTTP для получения дополнительной информации.

1 голос
/ 12 февраля 2009

Попробуйте использовать Reader вместо InputStream - я думаю, что это работает примерно так:

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);

Вы также можете просто передать кодировку конструктору сканера, как указано в другом ответе.

0 голосов
/ 13 февраля 2009
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());

Так работает !!!

0 голосов
/ 12 февраля 2009
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());

кодировка не меняется. почему?

...