web-dev-qa-db-fra.com

Un moyen le plus simple de charger correctement HTML de la page Web dans une chaîne in Java=

Tout ce que dit le titre.

Aider grandement apprécié!

28
Mark F

Une erreur extrêmement courante est l'échec de convertir correctement une réponse HTTP des octets en caractères. Pour ce faire, vous devez connaître le codage du personnage de la réponse. J'espère que cela est spécifié comme un paramètre dans le paramètre "Type de contenu". Mais le mettre dans le corps lui-même, comme un attribut "http-equiv" dans une balise meta est également une option.

Il est donc étonnamment compliqué de charger une page dans un String correctement, et même les bibliothèques tierces comme httpClient n'offrent pas de solution générale.

Voici une implémentation simple qui gérera la case la plus courante:

URL url = new URL("http://stackoverflow.com/questions/1381617");
URLConnection con = url.openConnection();
Pattern p = Pattern.compile("text/html;\\s+charset=([^\\s]+)\\s*");
Matcher m = p.matcher(con.getContentType());
/* If Content-Type doesn't match this pre-conception, choose default and 
 * hope for the best. */
String charset = m.matches() ? m.group(1) : "ISO-8859-1";
Reader r = new InputStreamReader(con.getInputStream(), charset);
StringBuilder buf = new StringBuilder();
while (true) {
  int ch = r.read();
  if (ch < 0)
    break;
  buf.append((char) ch);
}
String str = buf.toString();
32
erickson

Vous pouvez toujours le simplifier un peu en utilisant org.Apache.commons.io.IOUtils:

URL url = new URL("http://stackoverflow.com/questions/1381617");
URLConnection con = url.openConnection();
Pattern p = Pattern.compile("text/html;\\s+charset=([^\\s]+)\\s*");
Matcher m = p.matcher(con.getContentType());
/* If Content-Type doesn't match this pre-conception, choose default and 
 * hope for the best. */
String charset = m.matches() ? m.group(1) : "ISO-8859-1";
String str = IOUtils.toString(con.getInputStream(), charset);
4
altumano

J'utilise ceci:

        BufferedReader bufferedReader = new BufferedReader( 
                                     new InputStreamReader( 
                                          new URL(urlToSeach)
                                              .openConnection()
                                              .getInputStream() ));

        StringBuilder sb = new StringBuilder();
        String line = null;
        while( ( line = bufferedReader.readLine() ) != null ) {
             sb.append( line ) ;
             sb.append( "\n");
        }
        .... in finally.... 
        buffer.close();

Cela fonctionne la plupart des temps.

1
OscarRyz