سؤال

أحاول استخدام java.util.scanner لاتخاذ محتويات ويكيبيديا واستخدامها للبحث المستند إلى الكلمات. الحقيقة هي أنه كل شيء على ما يرام ولكن عند قراءة بعض الكلمات، تعطيني أخطاء. النظر في التعليمات البرمجية وجعل بعض الاختبارات اتضح أنه مع بعض الكلمات يبدو أنه لا يتعرف على الترميز أو نحو ذلك، والمحتوى ليس أكثر قابلية للقراءة. هذا هو الرمز المستخدم لاتخاذ الصفحة:

// -يبدأ-

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" للإيطالية ويكيبيديا. نتيجة طباعة الطباعة على Word Pubblico هي مثل هذا (Cutted): ï¿ï¿½] KSR> � ~ E �11a½ïeeeeeeeïeththththth4½4½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½½ ½dd½7_ | �ï¿ïïïïïïïï = = = 8ïï½ïïøø}

هل لديك أي فكرة لماذا؟ بعد نظرت في مصدر الصفحة ورؤوسها هي نفسها، مع نفس الترميز ...

اتضح أن المحتوى قد gzpeced، لذلك يمكنني أن أخبر ويكيبيديا بعدم إرسال صفحات تير مضغوطا أو إنها الطريقة الوحيدة؟ شكرا

هل كانت مفيدة؟

المحلول

حاول استخدام أ 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);

يمكنك أيضا نقل المجذوف إلى منشئ الماسح الضوئي مباشرة كما هو موضح في إجابة أخرى.

نصائح أخرى

حاول استخدام الماسح الضوئي مع مجموعة أحرف محددة:

public Scanner(InputStream source, String charsetName)

للحصول على المنشئ الافتراضي:

يتم تحويل البايتات من الدفق إلى أحرف باستخدام المجذاف الافتراضية للمنصة الأساسية.

الماسح الضوئي على java.sun.com.

تحتاج إلى استخدام URLConnection, ، بحيث يمكنك تحديد رأس نوع المحتوى في الاستجابة. يجب أن يخبرك هذا ترميز الشخصية لاستخدامه عند إنشاء الخاص بك Scanner.

على وجه التحديد، انظر إلى معلمة "Charset" لرأس نوع المحتوى.


لمنع ضغط gzip، اضبط رأس قبول الترميز إلى "الهوية". يرى مواصفات HTTP. للمزيد من المعلومات.

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

الترميز لا يتغير. لماذا ا؟

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

حتى يعمل!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top