2017-10-06 6 views
0

Ich habe ein Problem, das, glaube ich, liegt an den Objekten, die ich benutze, um ein Web zu lesen, in diesem Fall sowohl Retrofit2 als auch HttpURLConnection.Seltsames Verhalten beim Lesen der Quell-HTML eines Online-Webs

Die Situation ist: Ich muss ein Web ohne eine API (nicht meins) lesen und den gesamten HTML der Seite extrahieren, aber ich habe Probleme mit beiden Tools, die ich (die zuvor genannten) wegen des Webs versucht Format.

Die Bahn selbst hat diese Meta-Tag:

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">

so zeigt es die Akzentzeichen der Wörter mit ihnen (es ist in Spanisch). Und Sie können im Web deutlich sehen, dass Akzentzeichen schön von Chrome interpretiert werden, Mozilla oder einen anderen Browser:

enter image description here

Sie können auch die Akzentzeichen auf der HTML-Datei:

enter image description here

Aber hier ist, wenn das Problem mich auf den Rücken sticht:

ausgeführt: enter image description here

Raw: enter image description here

Und jetzt, ich werde Ihnen zeigen, was ich bisher ausprobiert.

Der erste Anruf war mit Retrofit2.

Der Client (ohne Konverter, weil ich es will roh (das klingt schlecht, btw)):

public static Retrofit getRaiaApi() { 
    if (raiaRetrofit == null) { 
     raiaRetrofit = new Retrofit.Builder() 
       .baseUrl(RAIA_URL) 
       .build(); 
    } 
    return raiaRetrofit; 
} 

Die POST-Methode:

@Headers({ 
     "Content-Type: application/x-www-form-urlencoded;charset=utf-8" 
}) 
@FormUrlEncoded 
@POST("index.php?operacion=consulta") 
Call<ResponseBody> postRaiaSearch(@Header("Cookie") String cookie, @Field("microchip") String microchip); 

Und der Anruf:

private void nextRaiaSearch(String sessionCookie) { 
    callRaiaSearch = apiInterfaceRaia.postRaiaSearch(sessionCookie, chipInput); 
    callRaiaSearch.enqueue(new Callback<ResponseBody>() { 
     @Override 
     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
      Log.v("call", "onResponse"); 
      try { 
       String html = response.body().string(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onFailure(Call<ResponseBody> call, Throwable t) { 
      Log.v("call", "onFailure"); 
     } 
    }); 
} 

Aber das gab mir, wie ich schon vorher erklärt habe, das HTML mit diesen Fehlern.

Dann dachte ich: "Nun, vielleicht wird Retrofit etwas konvertieren und das ist nicht wirklich die rohe Quelle des Webs, also lasst uns etwas anderes ausprobieren."

Und versuchte es mit einem einfachen HttpURLConnection.

private void nextRaiaSearch(String sessionCookie) throws IOException { 
    URL url = new URL("https://www.raia.es/index.php?operacion=consulta"); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    OutputStreamWriter request; 
    StringBuilder response = new StringBuilder(); 

    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
    connection.setRequestProperty("Cookie", sessionCookie); 
    connection.setRequestMethod("POST"); 
    connection.setConnectTimeout(60000); 
    connection.setReadTimeout(10000); 

    request = new OutputStreamWriter(connection.getOutputStream()); 
    request.write("microchip=" + chipInput); 
    request.flush(); 
    request.close(); 

    String line; 
    InputStreamReader input = new InputStreamReader(connection.getInputStream()); 
    BufferedReader reader = new BufferedReader(input); 
    while ((line = reader.readLine()) != null) { 
     response.append(line).append("\n"); 
    } 
    input.close(); 
    reader.close(); 

    String html = response.toString(); 
} 

ABER, das Ergebnis ist genau das gleiche: enter image description here

bin ich etwas fehlt? Sollte ich ein anderes Werkzeug verwenden?

+0

Das Problem ist die Server-Seite funktioniert ... es sendet Zeichen in ISO-8859-1 aber darüber im Header nicht erwähnt ... – Selvin

+0

Ja, das Problem ist, dass das Web von der lokalen Regierung ist, nicht meins, ich kann überhaupt nichts ändern. Deshalb wollte ich nur die Quell-HTML lesen, aber es gelingt mir nicht. – JMedinilla

+1

mit Ihrem 'HttpUrlConnection'-Code versuchen, den 2. Parameter des 'InputStreamReader'-Konstruktors zu setzen, um die gegebene Kodierung zu erzwingen – Selvin

Antwort

2

können Sie InputStreamReader verwenden, um die Codierung vom Server angeboten angeben.

Zum Beispiel:

InputStreamReader input = new InputStreamReader(connection.getInputStream(), Charset.forName("ISO-8859-1")); 

Ich hoffe, es

0

haben Sie versucht, mit dem Ausgang String zu spielen?

So etwas wie

String html = new String(response.toString().getBytes(), "UTF-8"); 
+0

Ich habe bereits versucht, diesen Zeichensatz zu verwenden und überhaupt keinen Zeichensatz zu schreiben, aber die Anfrage-Header ändern nichts an der Antwort. – JMedinilla

+0

gab meine Antwort noch einmal versuchen –

+0

Das war das erste, was ich ausprobiert habe. Aber wenn Sie die Antwort haben, hat es bereits die Fehler, also wird das Ändern des Zeichensatzes nichts dagegen tun. Danke für die Antwort trotzdem. – JMedinilla

Verwandte Themen