java.util.Scanner und Wikipedia
-
22-08-2019 - |
Frage
Ich versuche java.util.Scanner zu verwenden Wikipedia Inhalte zu nehmen und es für Wort basierter Suche zu verwenden. Tatsache ist, dass es alles in Ordnung ist, aber wenn ein paar Worte zu lesen es mir Fehler geben. Mit Blick auf Code und machen einige überprüfen es stellte sich heraus, dass mit einigen Worten, es scheint nicht die Codierung zu erkennen, oder so, und der Inhalt ist nicht mehr lesbar. Dies ist der Code verwendet, um die Seite zu übernehmen:
// -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
Das Problem entsteht, mit Worten wie „pubblico“ für die italienische wikipedia. das Ergebnis der println auf Wort pubblico ist wie folgt (abgeschnittene): ï¿ï¿½] Ksr> � ~ E �1A���E�ER3tHZ�4v�� & PZjtc�¿½ï¿½D�7_ | ���� = 8��Ø}
Haben Sie eine Idee, warum? Doch auf Seite Quelle geschaut und Header sind die gleiche, mit gleicher Codierung ...
sich gezeigt, dass Inhalte im gzip, so kann ich sagen, wikipedia nicht mir TEIR Seiten Reißverschluss zu senden oder es ist der einzige Weg? danke
Lösung
Versuchen Sie, eine Reader
anstelle eines InputStream
mit - ich denke, es ist so etwas wie dies funktioniert:
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);
Sie können auch nur den Zeichensatz an den Scanner Konstruktor übergeben direkt wie in einer anderen Antwort angegeben.
Andere Tipps
Versuchen Sie, den Scanner mit einem bestimmten Zeichensatz:
public Scanner(InputStream source, String charsetName)
Für den Standard-Konstruktor:
Bytes aus dem Stream wird in Zeichen umgewandelt unter Verwendung der Standard-charset zugrunde liegende Plattform.
Sie benötigen einen URLConnection
zu verwenden, so dass Sie die Content-Type-Header in der Antwort. Dies sollten Sie die Zeichenkodierung sagen zu verwenden, wenn Sie a href <= "http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html#Scanner(java.io. INPUTSTREAM-% 20java.lang.String)“rel = "nofollow noreferrer"> erstellen Sie Ihre Scanner
.
Im Einzelnen sehen Sie die "charset" Parameter der Content-Type-Header.
gzip-Komprimierung zu hemmen, die Accept-Encoding-Header auf "Identität". Siehe der HTTP-Spezifikation für weitere Informationen.
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());
Codierung ändert sich nicht. warum?
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());
So funktioniert !!!